LMMS
Loading...
Searching...
No Matches
juce_MemoryOutputStream.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 The code included in this file is provided under the terms of the ISC license
11 http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12 To use, copy, modify, and/or distribute this software for any purpose with or
13 without fee is hereby granted provided that the above copyright notice and
14 this permission notice appear in all copies.
15
16 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18 DISCLAIMED.
19
20 ==============================================================================
21*/
22
23namespace juce
24{
25
28{
29 internalBlock.setSize (initialSize, false);
30}
31
33 const bool appendToExistingBlockContent)
34 : blockToUse (&memoryBlockToWriteTo)
35{
36 if (appendToExistingBlockContent)
37 position = size = memoryBlockToWriteTo.getSize();
38}
39
40MemoryOutputStream::MemoryOutputStream (void* destBuffer, size_t destBufferSize)
41 : externalData (destBuffer), availableSize (destBufferSize)
42{
43 jassert (externalData != nullptr); // This must be a valid pointer.
44}
45
50
55
57{
58 if (blockToUse != &internalBlock && blockToUse != nullptr)
59 blockToUse->setSize (size, false);
60}
61
62void MemoryOutputStream::preallocate (const size_t bytesToPreallocate)
63{
64 if (blockToUse != nullptr)
65 blockToUse->ensureSize (bytesToPreallocate + 1);
66}
67
69{
70 position = 0;
71 size = 0;
72}
73
75{
76 jassert ((ssize_t) numBytes >= 0);
77 auto storageNeeded = position + numBytes;
78
79 char* data;
80
81 if (blockToUse != nullptr)
82 {
83 if (storageNeeded >= blockToUse->getSize())
84 blockToUse->ensureSize ((storageNeeded + jmin (storageNeeded / 2, (size_t) (1024 * 1024)) + 32) & ~31u);
85
86 data = static_cast<char*> (blockToUse->getData());
87 }
88 else
89 {
90 if (storageNeeded > availableSize)
91 return nullptr;
92
93 data = static_cast<char*> (externalData);
94 }
95
96 auto* writePointer = data + position;
97 position += numBytes;
99 return writePointer;
100}
101
102bool MemoryOutputStream::write (const void* const buffer, size_t howMany)
103{
104 if (howMany == 0)
105 return true;
106
107 jassert (buffer != nullptr);
108
109 if (auto* dest = prepareToWrite (howMany))
110 {
111 memcpy (dest, buffer, howMany);
112 return true;
113 }
114
115 return false;
116}
117
119{
120 if (howMany == 0)
121 return true;
122
123 if (auto* dest = prepareToWrite (howMany))
124 {
125 memset (dest, byte, howMany);
126 return true;
127 }
128
129 return false;
130}
131
133{
135 {
136 CharPointer_UTF8 (dest).write (c);
137 return true;
138 }
139
140 return false;
141}
142
147
149{
150 if (blockToUse == nullptr)
151 return externalData;
152
153 if (blockToUse->getSize() > size)
154 static_cast<char*> (blockToUse->getData()) [size] = 0;
155
156 return blockToUse->getData();
157}
158
160{
161 if (newPosition <= (int64) size)
162 {
163 // ok to seek backwards
164 position = jlimit ((size_t) 0, size, (size_t) newPosition);
165 return true;
166 }
167
168 // can't move beyond the end of the stream..
169 return false;
170}
171
173{
174 // before writing from an input, see if we can preallocate to make it more efficient..
175 int64 availableData = source.getTotalLength() - source.getPosition();
176
177 if (availableData > 0)
178 {
179 if (maxNumBytesToWrite > availableData || maxNumBytesToWrite < 0)
180 maxNumBytesToWrite = availableData;
181
182 if (blockToUse != nullptr)
183 preallocate (blockToUse->getSize() + (size_t) maxNumBytesToWrite);
184 }
185
186 return OutputStream::writeFromInputStream (source, maxNumBytesToWrite);
187}
188
190{
191 auto* d = static_cast<const char*> (getData());
193}
194
199
201{
202 auto dataSize = streamToRead.getDataSize();
203
204 if (dataSize > 0)
205 stream.write (streamToRead.getData(), dataSize);
206
207 return stream;
208}
209
210} // namespace juce
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
ostream & operator<<(ostream &out, const MidiEvent &ev)
Definition InMgr.cpp:9
void preallocate(size_t bytesToPreallocate)
Definition MemoryOutputStream.cpp:65
void trimExternalBlockSize()
Definition MemoryOutputStream.cpp:59
bool writeRepeatedByte(uint8 byte, size_t numTimesToRepeat) override
Definition MemoryOutputStream.cpp:108
char * prepareToWrite(size_t)
Definition MemoryOutputStream.cpp:76
void flush() override
Definition MemoryOutputStream.cpp:54
int64 writeFromInputStream(InputStream &, int64 maxNumBytesToWrite) override
Definition MemoryOutputStream.cpp:167
bool write(const void *, size_t) override
Definition MemoryOutputStream.cpp:92
String toString() const
Definition MemoryOutputStream.cpp:189
bool setPosition(int64) override
Definition MemoryOutputStream.cpp:154
String toUTF8() const
Definition MemoryOutputStream.cpp:183
bool appendUTF8Char(water_uchar character)
Definition MemoryOutputStream.cpp:122
MemoryOutputStream(size_t initialSize=256)
Definition MemoryOutputStream.cpp:31
const void * getData() const noexcept
Definition MemoryOutputStream.cpp:138
MemoryBlock getMemoryBlock() const
Definition MemoryOutputStream.cpp:133
~MemoryOutputStream()
Definition MemoryOutputStream.cpp:49
void reset() noexcept
Definition MemoryOutputStream.cpp:70
static String createStringFromData(const void *data, int size)
Definition String.cpp:1721
Definition juce_CharPointer_UTF8.h:35
static size_t getBytesRequiredFor(const juce_wchar charToWrite) noexcept
Definition juce_CharPointer_UTF8.h:286
void write(const juce_wchar charToWrite) noexcept
Definition juce_CharPointer_UTF8.h:327
Definition juce_InputStream.h:37
virtual int64 getPosition()=0
virtual int64 getTotalLength()=0
Definition juce_MemoryBlock.h:33
size_t getSize() const noexcept
Definition juce_MemoryBlock.h:127
Definition juce_MemoryOutputStream.h:36
const void * getData() const noexcept
Definition juce_MemoryOutputStream.cpp:148
size_t position
Definition juce_MemoryOutputStream.h:122
size_t getDataSize() const noexcept
Definition juce_MemoryOutputStream.h:80
MemoryBlock *const blockToUse
Definition juce_MemoryOutputStream.h:119
void preallocate(size_t bytesToPreallocate)
Definition juce_MemoryOutputStream.cpp:62
size_t availableSize
Definition juce_MemoryOutputStream.h:122
size_t size
Definition juce_MemoryOutputStream.h:122
char * prepareToWrite(size_t)
Definition juce_MemoryOutputStream.cpp:74
void trimExternalBlockSize()
Definition juce_MemoryOutputStream.cpp:56
void * externalData
Definition juce_MemoryOutputStream.h:121
MemoryBlock internalBlock
Definition juce_MemoryOutputStream.h:120
Definition juce_OutputStream.h:38
virtual bool write(const void *dataToWrite, size_t numberOfBytes)=0
virtual int64 writeFromInputStream(InputStream &source, int64 maxNumBytesToWrite)
Definition juce_OutputStream.cpp:296
Definition juce_String.h:53
unsigned d
Definition inflate.c:940
JSAMPIMAGE data
Definition jpeglib.h:945
#define jassert(expression)
#define JUCE_CALLTYPE
Definition carla_juce.cpp:31
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
long long int64
Definition juce_MathsFunctions.h:54
wchar_t juce_wchar
Definition juce_CharacterFunctions.h:42
unsigned char uint8
Definition juce_MathsFunctions.h:37
return c
Definition crypt.c:175
memcpy(hh, h, RAND_HEAD_LEN)
#define const
Definition zconf.h:137