Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Mueller <nexyon@gmail.com>2011-06-14 16:13:19 +0400
committerJoerg Mueller <nexyon@gmail.com>2011-06-14 16:13:19 +0400
commitd8974a60f6811faa2872b55eda41b03387614ed1 (patch)
treea517f14ea860a1c0111fe758c293d9471dca7496
parent8ff0c2e10720bd6e583a6b133b75e7bdff27a5f8 (diff)
3D Audio GSoC:
Changed Readers to top-down architecture instead of bottom-up.
-rw-r--r--intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp15
-rw-r--r--intern/audaspace/FX/AUD_BaseIIRFilterReader.h7
-rw-r--r--intern/audaspace/FX/AUD_DelayReader.cpp29
-rw-r--r--intern/audaspace/FX/AUD_DelayReader.h12
-rw-r--r--intern/audaspace/FX/AUD_DoubleReader.cpp17
-rw-r--r--intern/audaspace/FX/AUD_DoubleReader.h2
-rw-r--r--intern/audaspace/FX/AUD_EffectReader.cpp2
-rw-r--r--intern/audaspace/FX/AUD_EffectReader.h2
-rw-r--r--intern/audaspace/FX/AUD_FaderReader.cpp42
-rw-r--r--intern/audaspace/FX/AUD_FaderReader.h12
-rw-r--r--intern/audaspace/FX/AUD_LimiterReader.cpp6
-rw-r--r--intern/audaspace/FX/AUD_LimiterReader.h2
-rw-r--r--intern/audaspace/FX/AUD_LoopReader.cpp15
-rw-r--r--intern/audaspace/FX/AUD_LoopReader.h7
-rw-r--r--intern/audaspace/FX/AUD_ReverseReader.cpp32
-rw-r--r--intern/audaspace/FX/AUD_ReverseReader.h7
-rw-r--r--intern/audaspace/FX/AUD_SuperposeReader.cpp8
-rw-r--r--intern/audaspace/FX/AUD_SuperposeReader.h2
-rw-r--r--intern/audaspace/OpenAL/AUD_OpenALDevice.cpp23
-rw-r--r--intern/audaspace/OpenAL/AUD_OpenALDevice.h6
-rw-r--r--intern/audaspace/SRC/AUD_SRCResampleReader.cpp9
-rw-r--r--intern/audaspace/SRC/AUD_SRCResampleReader.h2
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp22
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGReader.h7
-rw-r--r--intern/audaspace/intern/AUD_BufferReader.cpp11
-rw-r--r--intern/audaspace/intern/AUD_BufferReader.h2
-rw-r--r--intern/audaspace/intern/AUD_C-API.cpp12
-rw-r--r--intern/audaspace/intern/AUD_ChannelMapperReader.cpp11
-rw-r--r--intern/audaspace/intern/AUD_ChannelMapperReader.h4
-rw-r--r--intern/audaspace/intern/AUD_ConverterReader.cpp12
-rw-r--r--intern/audaspace/intern/AUD_ConverterReader.h2
-rw-r--r--intern/audaspace/intern/AUD_IReader.h2
-rw-r--r--intern/audaspace/intern/AUD_LinearResampleReader.cpp7
-rw-r--r--intern/audaspace/intern/AUD_LinearResampleReader.h2
-rw-r--r--intern/audaspace/intern/AUD_Mixer.cpp48
-rw-r--r--intern/audaspace/intern/AUD_Mixer.h34
-rw-r--r--intern/audaspace/intern/AUD_SequencerReader.cpp18
-rw-r--r--intern/audaspace/intern/AUD_SequencerReader.h4
-rw-r--r--intern/audaspace/intern/AUD_SilenceReader.cpp11
-rw-r--r--intern/audaspace/intern/AUD_SilenceReader.h7
-rw-r--r--intern/audaspace/intern/AUD_SinusReader.cpp7
-rw-r--r--intern/audaspace/intern/AUD_SinusReader.h7
-rw-r--r--intern/audaspace/intern/AUD_SoftwareDevice.cpp27
-rw-r--r--intern/audaspace/intern/AUD_SoftwareDevice.h7
-rw-r--r--intern/audaspace/intern/AUD_StreamBufferFactory.cpp6
-rw-r--r--intern/audaspace/jack/AUD_JackDevice.cpp2
-rw-r--r--intern/audaspace/sndfile/AUD_SndFileReader.cpp10
-rw-r--r--intern/audaspace/sndfile/AUD_SndFileReader.h7
48 files changed, 185 insertions, 363 deletions
diff --git a/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp b/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp
index 5ad5903141b..9ddd8af019b 100644
--- a/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp
+++ b/intern/audaspace/FX/AUD_BaseIIRFilterReader.cpp
@@ -55,24 +55,15 @@ AUD_BaseIIRFilterReader::~AUD_BaseIIRFilterReader()
delete[] m_y;
}
-void AUD_BaseIIRFilterReader::read(int & length, sample_t* & buffer)
+void AUD_BaseIIRFilterReader::read(int & length, sample_t* buffer)
{
- sample_t* buf;
-
- int samplesize = AUD_SAMPLE_SIZE(m_reader->getSpecs());
-
- m_reader->read(length, buf);
-
- if(m_buffer.getSize() < length * samplesize)
- m_buffer.resize(length * samplesize);
-
- buffer = m_buffer.getBuffer();
+ m_reader->read(length, buffer);
for(m_channel = 0; m_channel < m_channels; m_channel++)
{
for(int i = 0; i < length; i++)
{
- m_x[m_xpos * CC] = buf[i * CC];
+ m_x[m_xpos * CC] = buffer[i * CC];
m_y[m_ypos * CC] = buffer[i * CC] = filter();
m_xpos = (m_xpos + 1) % m_xlen;
diff --git a/intern/audaspace/FX/AUD_BaseIIRFilterReader.h b/intern/audaspace/FX/AUD_BaseIIRFilterReader.h
index 9f81e2d8a25..2d1f21446a0 100644
--- a/intern/audaspace/FX/AUD_BaseIIRFilterReader.h
+++ b/intern/audaspace/FX/AUD_BaseIIRFilterReader.h
@@ -57,11 +57,6 @@ private:
const int m_ylen;
/**
- * The playback buffer.
- */
- AUD_Buffer m_buffer;
-
- /**
* The last in samples array.
*/
sample_t* m_x;
@@ -112,7 +107,7 @@ public:
virtual ~AUD_BaseIIRFilterReader();
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
virtual sample_t filter()=0;
};
diff --git a/intern/audaspace/FX/AUD_DelayReader.cpp b/intern/audaspace/FX/AUD_DelayReader.cpp
index a2224caf288..2e93184358e 100644
--- a/intern/audaspace/FX/AUD_DelayReader.cpp
+++ b/intern/audaspace/FX/AUD_DelayReader.cpp
@@ -36,8 +36,7 @@
AUD_DelayReader::AUD_DelayReader(AUD_Reference<AUD_IReader> reader, float delay) :
AUD_EffectReader(reader),
m_delay(int(delay * reader->getSpecs().rate)),
- m_remdelay(int(delay * reader->getSpecs().rate)),
- m_empty(true)
+ m_remdelay(int(delay * reader->getSpecs().rate))
{
}
@@ -70,46 +69,28 @@ int AUD_DelayReader::getPosition() const
return m_reader->getPosition() + m_delay;
}
-void AUD_DelayReader::read(int & length, sample_t* & buffer)
+void AUD_DelayReader::read(int & length, sample_t* buffer)
{
if(m_remdelay > 0)
{
AUD_Specs specs = m_reader->getSpecs();
int samplesize = AUD_SAMPLE_SIZE(specs);
- if(m_buffer.getSize() < length * samplesize)
- {
- m_buffer.resize(length * samplesize);
- m_empty = false;
- }
-
- buffer = m_buffer.getBuffer();
-
if(length > m_remdelay)
{
- if(!m_empty)
- memset(buffer, 0, m_remdelay * samplesize);
+ memset(buffer, 0, m_remdelay * samplesize);
int len = length - m_remdelay;
- sample_t* buf;
- m_reader->read(len, buf);
-
- memcpy(buffer + m_remdelay * specs.channels,
- buf, len * samplesize);
+ m_reader->read(len, buffer + m_remdelay * specs.channels);
if(len < length-m_remdelay)
length = m_remdelay + len;
m_remdelay = 0;
- m_empty = false;
}
else
{
- if(!m_empty)
- {
- memset(buffer, 0, length * samplesize);
- m_empty = true;
- }
+ memset(buffer, 0, length * samplesize);
m_remdelay -= length;
}
}
diff --git a/intern/audaspace/FX/AUD_DelayReader.h b/intern/audaspace/FX/AUD_DelayReader.h
index 695003a8c43..cb0ec9bcd9d 100644
--- a/intern/audaspace/FX/AUD_DelayReader.h
+++ b/intern/audaspace/FX/AUD_DelayReader.h
@@ -42,11 +42,6 @@ class AUD_DelayReader : public AUD_EffectReader
{
private:
/**
- * The playback buffer.
- */
- AUD_Buffer m_buffer;
-
- /**
* The delay level.
*/
const int m_delay;
@@ -56,11 +51,6 @@ private:
*/
int m_remdelay;
- /**
- * Whether the buffer is currently filled with zeros.
- */
- bool m_empty;
-
// hide copy constructor and operator=
AUD_DelayReader(const AUD_DelayReader&);
AUD_DelayReader& operator=(const AUD_DelayReader&);
@@ -76,7 +66,7 @@ public:
virtual void seek(int position);
virtual int getLength() const;
virtual int getPosition() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_DELAYREADER
diff --git a/intern/audaspace/FX/AUD_DoubleReader.cpp b/intern/audaspace/FX/AUD_DoubleReader.cpp
index bf1c770a2ed..605c49066d2 100644
--- a/intern/audaspace/FX/AUD_DoubleReader.cpp
+++ b/intern/audaspace/FX/AUD_DoubleReader.cpp
@@ -89,7 +89,7 @@ AUD_Specs AUD_DoubleReader::getSpecs() const
return m_reader1->getSpecs();
}
-void AUD_DoubleReader::read(int & length, sample_t* & buffer)
+void AUD_DoubleReader::read(int & length, sample_t* buffer)
{
if(!m_finished1)
{
@@ -98,23 +98,12 @@ void AUD_DoubleReader::read(int & length, sample_t* & buffer)
if(len < length)
{
- AUD_Specs specs = m_reader1->getSpecs();
- int samplesize = AUD_SAMPLE_SIZE(specs);
-
- if(m_buffer.getSize() < length * samplesize)
- m_buffer.resize(length * samplesize);
-
- sample_t* buf = buffer;
- buffer = m_buffer.getBuffer();
-
- memcpy(buffer, buf, len * samplesize);
+ const AUD_Specs specs = m_reader1->getSpecs();
len = length - len;
length -= len;
- m_reader2->read(len, buf);
- memcpy(buffer + length * specs.channels, buf,
- len * samplesize);
+ m_reader2->read(len, buffer + length * specs.channels);
length += len;
diff --git a/intern/audaspace/FX/AUD_DoubleReader.h b/intern/audaspace/FX/AUD_DoubleReader.h
index 4f01c47d052..d68000fe81a 100644
--- a/intern/audaspace/FX/AUD_DoubleReader.h
+++ b/intern/audaspace/FX/AUD_DoubleReader.h
@@ -85,7 +85,7 @@ public:
virtual int getLength() const;
virtual int getPosition() const;
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_DOUBLEREADER
diff --git a/intern/audaspace/FX/AUD_EffectReader.cpp b/intern/audaspace/FX/AUD_EffectReader.cpp
index d7c4eeb2ee1..aa8fe7a7f35 100644
--- a/intern/audaspace/FX/AUD_EffectReader.cpp
+++ b/intern/audaspace/FX/AUD_EffectReader.cpp
@@ -65,7 +65,7 @@ AUD_Specs AUD_EffectReader::getSpecs() const
return m_reader->getSpecs();
}
-void AUD_EffectReader::read(int & length, sample_t* & buffer)
+void AUD_EffectReader::read(int & length, sample_t* buffer)
{
m_reader->read(length, buffer);
}
diff --git a/intern/audaspace/FX/AUD_EffectReader.h b/intern/audaspace/FX/AUD_EffectReader.h
index 6aa185edcd0..cfb8e5b6e77 100644
--- a/intern/audaspace/FX/AUD_EffectReader.h
+++ b/intern/audaspace/FX/AUD_EffectReader.h
@@ -69,7 +69,7 @@ public:
virtual int getLength() const;
virtual int getPosition() const;
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_EFFECTREADER
diff --git a/intern/audaspace/FX/AUD_FaderReader.cpp b/intern/audaspace/FX/AUD_FaderReader.cpp
index e319e205e5f..7fe5c503c23 100644
--- a/intern/audaspace/FX/AUD_FaderReader.cpp
+++ b/intern/audaspace/FX/AUD_FaderReader.cpp
@@ -38,12 +38,11 @@ AUD_FaderReader::AUD_FaderReader(AUD_Reference<AUD_IReader> reader, AUD_FadeType
AUD_EffectReader(reader),
m_type(type),
m_start(start),
- m_length(length),
- m_empty(true)
+ m_length(length)
{
}
-void AUD_FaderReader::read(int & length, sample_t* & buffer)
+void AUD_FaderReader::read(int & length, sample_t* buffer)
{
int position = m_reader->getPosition();
AUD_Specs specs = m_reader->getSpecs();
@@ -55,46 +54,18 @@ void AUD_FaderReader::read(int & length, sample_t* & buffer)
{
if(m_type != AUD_FADE_OUT)
{
- if(m_buffer.getSize() < length * samplesize)
- {
- m_buffer.resize(length * samplesize);
- m_empty = false;
- }
-
- buffer = m_buffer.getBuffer();
-
- if(!m_empty)
- {
- memset(buffer, 0, length * samplesize);
- m_empty = true;
- }
+ memset(buffer, 0, length * samplesize);
}
}
else if(position / (float)specs.rate >= m_start+m_length)
{
if(m_type == AUD_FADE_OUT)
{
- if(m_buffer.getSize() < length * samplesize)
- {
- m_buffer.resize(length * samplesize);
- m_empty = false;
- }
-
- buffer = m_buffer.getBuffer();
-
- if(!m_empty)
- {
- memset(buffer, 0, length * samplesize);
- m_empty = true;
- }
+ memset(buffer, 0, length * samplesize);
}
}
else
{
- if(m_buffer.getSize() < length * samplesize)
- m_buffer.resize(length * samplesize);
-
- sample_t* buf = m_buffer.getBuffer();
float volume = 1.0f;
for(int i = 0; i < length * specs.channels; i++)
@@ -111,10 +82,7 @@ void AUD_FaderReader::read(int & length, sample_t* & buffer)
volume = 1.0f - volume;
}
- buf[i] = buffer[i] * volume;
+ buffer[i] = buffer[i] * volume;
}
-
- buffer = buf;
- m_empty = false;
}
}
diff --git a/intern/audaspace/FX/AUD_FaderReader.h b/intern/audaspace/FX/AUD_FaderReader.h
index b088477bce0..c0eb3d27d36 100644
--- a/intern/audaspace/FX/AUD_FaderReader.h
+++ b/intern/audaspace/FX/AUD_FaderReader.h
@@ -58,16 +58,6 @@ private:
*/
const float m_length;
- /**
- * The playback buffer.
- */
- AUD_Buffer m_buffer;
-
- /**
- * Whether the buffer is empty.
- */
- bool m_empty;
-
// hide copy constructor and operator=
AUD_FaderReader(const AUD_FaderReader&);
AUD_FaderReader& operator=(const AUD_FaderReader&);
@@ -82,7 +72,7 @@ public:
AUD_FaderReader(AUD_Reference<AUD_IReader> reader, AUD_FadeType type,
float start,float length);
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_FADERREADER
diff --git a/intern/audaspace/FX/AUD_LimiterReader.cpp b/intern/audaspace/FX/AUD_LimiterReader.cpp
index d5a46568b3e..0f87679410e 100644
--- a/intern/audaspace/FX/AUD_LimiterReader.cpp
+++ b/intern/audaspace/FX/AUD_LimiterReader.cpp
@@ -48,14 +48,14 @@ AUD_LimiterReader::AUD_LimiterReader(AUD_Reference<AUD_IReader> reader,
{
// skip first m_start samples by reading them
int length = AUD_DEFAULT_BUFFER_SIZE;
- sample_t* buffer;
+ AUD_Buffer buffer(AUD_DEFAULT_BUFFER_SIZE * AUD_SAMPLE_SIZE(m_reader->getSpecs()));
for(int len = m_start;
length == AUD_DEFAULT_BUFFER_SIZE;
len -= AUD_DEFAULT_BUFFER_SIZE)
{
if(len < AUD_DEFAULT_BUFFER_SIZE)
length = len;
- m_reader->read(length, buffer);
+ m_reader->read(length, buffer.getBuffer());
}
}
}
@@ -80,7 +80,7 @@ int AUD_LimiterReader::getPosition() const
return AUD_MIN(pos, m_end) - m_start;
}
-void AUD_LimiterReader::read(int & length, sample_t* & buffer)
+void AUD_LimiterReader::read(int & length, sample_t* buffer)
{
if(m_end >= 0)
{
diff --git a/intern/audaspace/FX/AUD_LimiterReader.h b/intern/audaspace/FX/AUD_LimiterReader.h
index f4502c33ae0..660dc26b7a3 100644
--- a/intern/audaspace/FX/AUD_LimiterReader.h
+++ b/intern/audaspace/FX/AUD_LimiterReader.h
@@ -67,7 +67,7 @@ public:
virtual void seek(int position);
virtual int getLength() const;
virtual int getPosition() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_LIMITERREADER
diff --git a/intern/audaspace/FX/AUD_LoopReader.cpp b/intern/audaspace/FX/AUD_LoopReader.cpp
index b7b8937abb8..0efee5b55c0 100644
--- a/intern/audaspace/FX/AUD_LoopReader.cpp
+++ b/intern/audaspace/FX/AUD_LoopReader.cpp
@@ -68,10 +68,9 @@ int AUD_LoopReader::getPosition() const
return m_reader->getPosition() * (m_count < 0 ? 1 : m_count);
}
-void AUD_LoopReader::read(int & length, sample_t* & buffer)
+void AUD_LoopReader::read(int & length, sample_t* buffer)
{
AUD_Specs specs = m_reader->getSpecs();
- int samplesize = AUD_SAMPLE_SIZE(specs);
int len = length;
@@ -81,13 +80,6 @@ void AUD_LoopReader::read(int & length, sample_t* & buffer)
{
int pos = 0;
- if(m_buffer.getSize() < length * samplesize)
- m_buffer.resize(length * samplesize);
-
- sample_t* buf = m_buffer.getBuffer();
-
- memcpy(buf + pos * specs.channels, buffer, len * samplesize);
-
pos += len;
while(pos < length && m_left)
@@ -98,19 +90,16 @@ void AUD_LoopReader::read(int & length, sample_t* & buffer)
m_reader->seek(0);
len = length - pos;
- m_reader->read(len, buffer);
+ m_reader->read(len, buffer + pos * specs.channels);
// prevent endless loop
if(!len)
break;
- memcpy(buf + pos * specs.channels, buffer, len * samplesize);
-
pos += len;
}
length = pos;
- buffer = buf;
}
else
length = len;
diff --git a/intern/audaspace/FX/AUD_LoopReader.h b/intern/audaspace/FX/AUD_LoopReader.h
index 866d6f7885f..d1338245df4 100644
--- a/intern/audaspace/FX/AUD_LoopReader.h
+++ b/intern/audaspace/FX/AUD_LoopReader.h
@@ -43,11 +43,6 @@ class AUD_LoopReader : public AUD_EffectReader
{
private:
/**
- * The playback buffer.
- */
- AUD_Buffer m_buffer;
-
- /**
* The loop count.
*/
const int m_count;
@@ -73,7 +68,7 @@ public:
virtual void seek(int position);
virtual int getLength() const;
virtual int getPosition() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_LOOPREADER
diff --git a/intern/audaspace/FX/AUD_ReverseReader.cpp b/intern/audaspace/FX/AUD_ReverseReader.cpp
index 8ca9f8609bb..030896d2eae 100644
--- a/intern/audaspace/FX/AUD_ReverseReader.cpp
+++ b/intern/audaspace/FX/AUD_ReverseReader.cpp
@@ -60,7 +60,7 @@ int AUD_ReverseReader::getPosition() const
return m_position;
}
-void AUD_ReverseReader::read(int & length, sample_t* & buffer)
+void AUD_ReverseReader::read(int & length, sample_t* buffer)
{
// first correct the length
if(m_position + length > m_length)
@@ -72,36 +72,34 @@ void AUD_ReverseReader::read(int & length, sample_t* & buffer)
return;
}
- AUD_Specs specs = getSpecs();
- int samplesize = AUD_SAMPLE_SIZE(specs);
+ const AUD_Specs specs = getSpecs();
+ const int samplesize = AUD_SAMPLE_SIZE(specs);
- // resize buffer if needed
- if(m_buffer.getSize() < length * samplesize)
- m_buffer.resize(length * samplesize);
+ sample_t temp[specs.channels];
- buffer = m_buffer.getBuffer();
-
- sample_t* buf;
int len = length;
// read from reader
m_reader->seek(m_length - m_position - len);
- m_reader->read(len, buf);
+ m_reader->read(len, buffer);
// set null if reader didn't give enough data
if(len < length)
- {
memset(buffer, 0, (length - len) * samplesize);
- buffer += (length - len) * specs.channels;
- }
// copy the samples reverted
- for(int i = 0; i < len; i++)
+ for(int i = 0; i < length / 2; i++)
+ {
+ memcpy(temp,
+ buffer + (len - 1 - i) * specs.channels,
+ samplesize);
+ memcpy(buffer + (len - 1 - i) * specs.channels,
+ buffer + i * specs.channels,
+ samplesize);
memcpy(buffer + i * specs.channels,
- buf + (len - 1 - i) * specs.channels,
+ temp,
samplesize);
+ }
m_position += length;
-
- buffer = m_buffer.getBuffer();
}
diff --git a/intern/audaspace/FX/AUD_ReverseReader.h b/intern/audaspace/FX/AUD_ReverseReader.h
index d8086e08534..8525acaab36 100644
--- a/intern/audaspace/FX/AUD_ReverseReader.h
+++ b/intern/audaspace/FX/AUD_ReverseReader.h
@@ -52,11 +52,6 @@ private:
*/
int m_position;
- /**
- * The playback buffer.
- */
- AUD_Buffer m_buffer;
-
// hide copy constructor and operator=
AUD_ReverseReader(const AUD_ReverseReader&);
AUD_ReverseReader& operator=(const AUD_ReverseReader&);
@@ -73,7 +68,7 @@ public:
virtual void seek(int position);
virtual int getLength() const;
virtual int getPosition() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_REVERSEREADER
diff --git a/intern/audaspace/FX/AUD_SuperposeReader.cpp b/intern/audaspace/FX/AUD_SuperposeReader.cpp
index 6f39dcadf40..3ad2420fc91 100644
--- a/intern/audaspace/FX/AUD_SuperposeReader.cpp
+++ b/intern/audaspace/FX/AUD_SuperposeReader.cpp
@@ -82,24 +82,22 @@ AUD_Specs AUD_SuperposeReader::getSpecs() const
return m_reader1->getSpecs();
}
-void AUD_SuperposeReader::read(int & length, sample_t* & buffer)
+void AUD_SuperposeReader::read(int & length, sample_t* buffer)
{
AUD_Specs specs = m_reader1->getSpecs();
int samplesize = AUD_SAMPLE_SIZE(specs);
if(m_buffer.getSize() < length * samplesize)
m_buffer.resize(length * samplesize);
- buffer = m_buffer.getBuffer();
int len1 = length;
- sample_t* buf;
- m_reader1->read(len1, buf);
- memcpy(buffer, buf, len1 * samplesize);
+ m_reader1->read(len1, buffer);
if(len1 < length)
memset(buffer + len1 * specs.channels, 0, (length - len1) * samplesize);
int len2 = length;
+ sample_t* buf = m_buffer.getBuffer();
m_reader2->read(len2, buf);
for(int i = 0; i < len2 * specs.channels; i++)
diff --git a/intern/audaspace/FX/AUD_SuperposeReader.h b/intern/audaspace/FX/AUD_SuperposeReader.h
index 26e4b138dfa..5a2a2a1d8d1 100644
--- a/intern/audaspace/FX/AUD_SuperposeReader.h
+++ b/intern/audaspace/FX/AUD_SuperposeReader.h
@@ -80,7 +80,7 @@ public:
virtual int getLength() const;
virtual int getPosition() const;
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_SUPERPOSEREADER
diff --git a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
index a3b0bff316e..2780f108cda 100644
--- a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
+++ b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
@@ -130,7 +130,6 @@ void AUD_OpenALDevice::updateStreams()
AUD_OpenALHandle* sound;
int length;
- sample_t* buffer;
ALint info;
AUD_DeviceSpecs specs = m_specs;
@@ -161,6 +160,8 @@ void AUD_OpenALDevice::updateStreams()
if(info)
{
specs.specs = sound->reader->getSpecs();
+ if(m_buffer.getSize() < m_buffersize * AUD_DEVICE_SAMPLE_SIZE(specs))
+ m_buffer.resize(m_buffersize * AUD_DEVICE_SAMPLE_SIZE(specs));
// for all empty buffers
while(info--)
@@ -170,7 +171,7 @@ void AUD_OpenALDevice::updateStreams()
{
// read data
length = m_buffersize;
- sound->reader->read(length, buffer);
+ sound->reader->read(length, m_buffer.getBuffer());
// looping necessary?
if(length == 0 && sound->loopcount)
@@ -181,7 +182,7 @@ void AUD_OpenALDevice::updateStreams()
sound->reader->seek(0);
length = m_buffersize;
- sound->reader->read(length, buffer);
+ sound->reader->read(length, m_buffer.getBuffer());
}
// read nothing?
@@ -204,7 +205,7 @@ void AUD_OpenALDevice::updateStreams()
// fill with new data
alBufferData(sound->buffers[sound->current],
sound->format,
- buffer, length *
+ m_buffer.getBuffer(), length *
AUD_DEVICE_SAMPLE_SIZE(specs),
specs.rate);
@@ -581,14 +582,15 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_Reference<AUD_IReader> reader, bool keep)
try
{
- sample_t* buf;
+ if(m_buffer.getSize() < m_buffersize * AUD_DEVICE_SAMPLE_SIZE(specs))
+ m_buffer.resize(m_buffersize * AUD_DEVICE_SAMPLE_SIZE(specs));
int length;
for(int i = 0; i < AUD_OPENAL_CYCLE_BUFFERS; i++)
{
length = m_buffersize;
- reader->read(length, buf);
- alBufferData(sound->buffers[i], sound->format, buf,
+ reader->read(length, m_buffer.getBuffer());
+ alBufferData(sound->buffers[i], sound->format, m_buffer.getBuffer(),
length * AUD_DEVICE_SAMPLE_SIZE(specs),
specs.rate);
if(alGetError() != AL_NO_ERROR)
@@ -879,17 +881,18 @@ bool AUD_OpenALDevice::seek(AUD_Handle* handle, float position)
ALenum err;
if((err = alGetError()) == AL_NO_ERROR)
{
- sample_t* buf;
int length;
AUD_DeviceSpecs specs = m_specs;
specs.specs = alhandle->reader->getSpecs();
+ if(m_buffer.getSize() < m_buffersize * AUD_DEVICE_SAMPLE_SIZE(specs))
+ m_buffer.resize(m_buffersize * AUD_DEVICE_SAMPLE_SIZE(specs));
for(int i = 0; i < AUD_OPENAL_CYCLE_BUFFERS; i++)
{
length = m_buffersize;
- alhandle->reader->read(length, buf);
+ alhandle->reader->read(length, m_buffer.getBuffer());
alBufferData(alhandle->buffers[i], alhandle->format,
- buf,
+ m_buffer.getBuffer(),
length * AUD_DEVICE_SAMPLE_SIZE(specs),
specs.rate);
diff --git a/intern/audaspace/OpenAL/AUD_OpenALDevice.h b/intern/audaspace/OpenAL/AUD_OpenALDevice.h
index 3bca47f1805..d5db5989fe7 100644
--- a/intern/audaspace/OpenAL/AUD_OpenALDevice.h
+++ b/intern/audaspace/OpenAL/AUD_OpenALDevice.h
@@ -34,6 +34,7 @@
#include "AUD_IDevice.h"
#include "AUD_I3DDevice.h"
+#include "AUD_Buffer.h"
struct AUD_OpenALHandle;
struct AUD_OpenALBufferedFactory;
@@ -104,6 +105,11 @@ private:
int m_buffersize;
/**
+ * Device buffer.
+ */
+ AUD_Buffer m_buffer;
+
+ /**
* Starts the streaming thread.
*/
void start();
diff --git a/intern/audaspace/SRC/AUD_SRCResampleReader.cpp b/intern/audaspace/SRC/AUD_SRCResampleReader.cpp
index e9a94418b60..42696a1caaa 100644
--- a/intern/audaspace/SRC/AUD_SRCResampleReader.cpp
+++ b/intern/audaspace/SRC/AUD_SRCResampleReader.cpp
@@ -75,11 +75,10 @@ AUD_SRCResampleReader::~AUD_SRCResampleReader()
long AUD_SRCResampleReader::doCallback(float** data)
{
int length = m_buffer.getSize() / AUD_SAMPLE_SIZE(m_tspecs);
- sample_t* buffer;
- m_reader->read(length, buffer);
+ *data = m_buffer.getBuffer();
+ m_reader->read(length, *data);
- *data = buffer;
return length;
}
@@ -105,15 +104,13 @@ AUD_Specs AUD_SRCResampleReader::getSpecs() const
return m_tspecs;
}
-void AUD_SRCResampleReader::read(int & length, sample_t* & buffer)
+void AUD_SRCResampleReader::read(int & length, sample_t* buffer)
{
int size = length * AUD_SAMPLE_SIZE(m_tspecs);
if(m_buffer.getSize() < size)
m_buffer.resize(size);
- buffer = m_buffer.getBuffer();
-
length = src_callback_read(m_src, m_factor, length, buffer);
m_position += length;
diff --git a/intern/audaspace/SRC/AUD_SRCResampleReader.h b/intern/audaspace/SRC/AUD_SRCResampleReader.h
index 21193661911..2d67e636bd7 100644
--- a/intern/audaspace/SRC/AUD_SRCResampleReader.h
+++ b/intern/audaspace/SRC/AUD_SRCResampleReader.h
@@ -104,7 +104,7 @@ public:
virtual int getLength() const;
virtual int getPosition() const;
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_SRCRESAMPLEREADER
diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
index ed6ca5d142f..bacbbf2a725 100644
--- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
+++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
@@ -341,14 +341,14 @@ void AUD_FFMPEGReader::seek(int position)
{
// read until we're at the right position
int length = AUD_DEFAULT_BUFFER_SIZE;
- sample_t* buffer;
+ AUD_Buffer buffer(length * AUD_SAMPLE_SIZE(m_specs));
for(int len = position - m_position;
length == AUD_DEFAULT_BUFFER_SIZE;
len -= AUD_DEFAULT_BUFFER_SIZE)
{
if(len < AUD_DEFAULT_BUFFER_SIZE)
length = len;
- read(length, buffer);
+ read(length, buffer.getBuffer());
}
}
}
@@ -381,7 +381,7 @@ AUD_Specs AUD_FFMPEGReader::getSpecs() const
return m_specs.specs;
}
-void AUD_FFMPEGReader::read(int & length, sample_t* & buffer)
+void AUD_FFMPEGReader::read(int & length, sample_t* buffer)
{
// read packages and decode them
AVPacket packet;
@@ -390,11 +390,7 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer)
int left = length;
int sample_size = AUD_DEVICE_SAMPLE_SIZE(m_specs);
- // resize output buffer if necessary
- if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(m_specs))
- m_buffer.resize(length * AUD_SAMPLE_SIZE(m_specs));
-
- buffer = m_buffer.getBuffer();
+ sample_t* buf = buffer;
pkgbuf_pos = m_pkgbuf_left;
m_pkgbuf_left = 0;
@@ -402,9 +398,9 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer)
if(pkgbuf_pos > 0)
{
data_size = AUD_MIN(pkgbuf_pos, left * sample_size);
- m_convert((data_t*) buffer, (data_t*) m_pkgbuf.getBuffer(),
+ m_convert((data_t*) buf, (data_t*) m_pkgbuf.getBuffer(),
data_size / AUD_FORMAT_SIZE(m_specs.format));
- buffer += data_size / AUD_FORMAT_SIZE(m_specs.format);
+ buf += data_size / AUD_FORMAT_SIZE(m_specs.format);
left -= data_size/sample_size;
}
@@ -419,9 +415,9 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer)
// copy to output buffer
data_size = AUD_MIN(pkgbuf_pos, left * sample_size);
- m_convert((data_t*) buffer, (data_t*) m_pkgbuf.getBuffer(),
+ m_convert((data_t*) buf, (data_t*) m_pkgbuf.getBuffer(),
data_size / AUD_FORMAT_SIZE(m_specs.format));
- buffer += data_size / AUD_FORMAT_SIZE(m_specs.format);
+ buf += data_size / AUD_FORMAT_SIZE(m_specs.format);
left -= data_size/sample_size;
}
av_free_packet(&packet);
@@ -435,8 +431,6 @@ void AUD_FFMPEGReader::read(int & length, sample_t* & buffer)
pkgbuf_pos-data_size);
}
- buffer = m_buffer.getBuffer();
-
if(left > 0)
length -= left;
m_position += length;
diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h
index 26e66859451..c5bfd11dcbc 100644
--- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h
+++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h
@@ -61,11 +61,6 @@ private:
int m_position;
/**
- * The playback buffer.
- */
- AUD_Buffer m_buffer;
-
- /**
* The specification of the audio data.
*/
AUD_DeviceSpecs m_specs;
@@ -167,7 +162,7 @@ public:
virtual int getLength() const;
virtual int getPosition() const;
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_FFMPEGREADER
diff --git a/intern/audaspace/intern/AUD_BufferReader.cpp b/intern/audaspace/intern/AUD_BufferReader.cpp
index 0ac967b29b0..08ed52ea497 100644
--- a/intern/audaspace/intern/AUD_BufferReader.cpp
+++ b/intern/audaspace/intern/AUD_BufferReader.cpp
@@ -33,6 +33,8 @@
#include "AUD_Buffer.h"
#include "AUD_Space.h"
+#include <cstring>
+
AUD_BufferReader::AUD_BufferReader(AUD_Reference<AUD_Buffer> buffer,
AUD_Specs specs) :
m_position(0), m_buffer(buffer), m_specs(specs)
@@ -64,17 +66,22 @@ AUD_Specs AUD_BufferReader::getSpecs() const
return m_specs;
}
-void AUD_BufferReader::read(int & length, sample_t* & buffer)
+void AUD_BufferReader::read(int & length, sample_t* buffer)
{
int sample_size = AUD_SAMPLE_SIZE(m_specs);
- buffer = m_buffer->getBuffer() + m_position * m_specs.channels;
+ sample_t* buf = m_buffer->getBuffer() + m_position * m_specs.channels;
// in case the end of the buffer is reached
if(m_buffer->getSize() < (m_position + length) * sample_size)
length = m_buffer->getSize() / sample_size - m_position;
if(length < 0)
+ {
length = 0;
+ return;
+ }
+
m_position += length;
+ memcpy(buffer, buf, length * sample_size);
}
diff --git a/intern/audaspace/intern/AUD_BufferReader.h b/intern/audaspace/intern/AUD_BufferReader.h
index 3369672703c..16d7136ab63 100644
--- a/intern/audaspace/intern/AUD_BufferReader.h
+++ b/intern/audaspace/intern/AUD_BufferReader.h
@@ -76,7 +76,7 @@ public:
virtual int getLength() const;
virtual int getPosition() const;
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_BUFFERREADER
diff --git a/intern/audaspace/intern/AUD_C-API.cpp b/intern/audaspace/intern/AUD_C-API.cpp
index 08fb55f7605..b0050abe7ac 100644
--- a/intern/audaspace/intern/AUD_C-API.cpp
+++ b/intern/audaspace/intern/AUD_C-API.cpp
@@ -778,13 +778,11 @@ float* AUD_readSoundBuffer(const char* filename, float low, float high,
int len;
int position = 0;
- sample_t* readbuffer;
do
{
len = samplerate;
buffer.resize((position + len) * sizeof(float), true);
- reader->read(len, readbuffer);
- memcpy(buffer.getBuffer() + position, readbuffer, len * sizeof(float));
+ reader->read(len, buffer.getBuffer() + position);
position += len;
} while(len != 0);
@@ -868,6 +866,7 @@ int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length)
{
AUD_DeviceSpecs specs;
sample_t* buf;
+ AUD_Buffer aBuffer;
specs.rate = AUD_RATE_INVALID;
specs.channels = AUD_CHANNELS_MONO;
@@ -882,6 +881,13 @@ int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length)
for(int i = 0; i < length; i++)
{
len = floor(samplejump * (i+1)) - floor(samplejump * i);
+
+ if(aBuffer.getSize() < len * AUD_SAMPLE_SIZE(reader->getSpecs()))
+ {
+ aBuffer.resize(len * AUD_SAMPLE_SIZE(reader->getSpecs()));
+ buf = aBuffer.getBuffer();
+ }
+
reader->read(len, buf);
if(len < 1)
diff --git a/intern/audaspace/intern/AUD_ChannelMapperReader.cpp b/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
index 3079d31c9e9..a70eebc192c 100644
--- a/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
+++ b/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
@@ -76,16 +76,15 @@ AUD_Specs AUD_ChannelMapperReader::getSpecs() const
return m_specs;
}
-void AUD_ChannelMapperReader::read(int & length, sample_t* & buffer)
+void AUD_ChannelMapperReader::read(int & length, sample_t* buffer)
{
- sample_t* in = buffer;
+ if(m_buffer.getSize() < length * m_rch * sizeof(sample_t))
+ m_buffer.resize(length * m_rch * sizeof(sample_t));
- m_reader->read(length, in);
+ sample_t* in = m_buffer.getBuffer();
- if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(m_specs))
- m_buffer.resize(length * AUD_SAMPLE_SIZE(m_specs));
+ m_reader->read(length, in);
- buffer = m_buffer.getBuffer();
sample_t sum;
for(int i = 0; i < length; i++)
diff --git a/intern/audaspace/intern/AUD_ChannelMapperReader.h b/intern/audaspace/intern/AUD_ChannelMapperReader.h
index 1c7dba1df7c..31c22b8cf5a 100644
--- a/intern/audaspace/intern/AUD_ChannelMapperReader.h
+++ b/intern/audaspace/intern/AUD_ChannelMapperReader.h
@@ -43,7 +43,7 @@ class AUD_ChannelMapperReader : public AUD_EffectReader
{
private:
/**
- * The sound output buffer.
+ * The sound reading buffer.
*/
AUD_Buffer m_buffer;
@@ -80,7 +80,7 @@ public:
~AUD_ChannelMapperReader();
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_CHANNELMAPPERREADER
diff --git a/intern/audaspace/intern/AUD_ConverterReader.cpp b/intern/audaspace/intern/AUD_ConverterReader.cpp
index 6927f3e969c..7e0246f5d62 100644
--- a/intern/audaspace/intern/AUD_ConverterReader.cpp
+++ b/intern/audaspace/intern/AUD_ConverterReader.cpp
@@ -75,17 +75,15 @@ AUD_Specs AUD_ConverterReader::getSpecs() const
return m_specs.specs;
}
-void AUD_ConverterReader::read(int & length, sample_t* & buffer)
+void AUD_ConverterReader::read(int & length, sample_t* buffer)
{
- m_reader->read(length, buffer);
-
- int samplesize = AUD_SAMPLE_SIZE(m_specs);
+ int samplesize = AUD_SAMPLE_SIZE(m_reader->getSpecs());
if(m_buffer.getSize() < length * samplesize)
m_buffer.resize(length * samplesize);
- m_convert((data_t*)m_buffer.getBuffer(), (data_t*)buffer,
- length * m_specs.channels);
+ m_reader->read(length, m_buffer.getBuffer());
- buffer = m_buffer.getBuffer();
+ m_convert((data_t*)buffer, (data_t*)m_buffer.getBuffer(),
+ length * m_specs.channels);
}
diff --git a/intern/audaspace/intern/AUD_ConverterReader.h b/intern/audaspace/intern/AUD_ConverterReader.h
index 6f252b5f9f9..958fe6d1897 100644
--- a/intern/audaspace/intern/AUD_ConverterReader.h
+++ b/intern/audaspace/intern/AUD_ConverterReader.h
@@ -70,7 +70,7 @@ public:
AUD_ConverterReader(AUD_Reference<AUD_IReader> reader, AUD_DeviceSpecs specs);
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_CONVERTERREADER
diff --git a/intern/audaspace/intern/AUD_IReader.h b/intern/audaspace/intern/AUD_IReader.h
index 7c31c593964..01baf13f540 100644
--- a/intern/audaspace/intern/AUD_IReader.h
+++ b/intern/audaspace/intern/AUD_IReader.h
@@ -100,7 +100,7 @@ public:
* A smaller value also indicates the end of the reader.
* \param[out] buffer The pointer to the buffer with the samples.
*/
- virtual void read(int & length, sample_t* & buffer)=0;
+ virtual void read(int & length, sample_t* buffer)=0;
};
#endif //AUD_IREADER
diff --git a/intern/audaspace/intern/AUD_LinearResampleReader.cpp b/intern/audaspace/intern/AUD_LinearResampleReader.cpp
index 6217826eeec..6cb1d946ea3 100644
--- a/intern/audaspace/intern/AUD_LinearResampleReader.cpp
+++ b/intern/audaspace/intern/AUD_LinearResampleReader.cpp
@@ -71,18 +71,17 @@ AUD_Specs AUD_LinearResampleReader::getSpecs() const
return m_tspecs;
}
-void AUD_LinearResampleReader::read(int & length, sample_t* & buffer)
+void AUD_LinearResampleReader::read(int & length, sample_t* buffer)
{
int samplesize = AUD_SAMPLE_SIZE(m_tspecs);
- int size = length * samplesize;
+ int size = length * AUD_SAMPLE_SIZE(m_sspecs);
if(m_buffer.getSize() < size)
m_buffer.resize(size);
int need = ceil((m_position + length) / m_factor) + 1 - m_sposition;
int len = need;
- sample_t* buf;
- buffer = m_buffer.getBuffer();
+ sample_t* buf = m_buffer.getBuffer();
m_reader->read(len, buf);
diff --git a/intern/audaspace/intern/AUD_LinearResampleReader.h b/intern/audaspace/intern/AUD_LinearResampleReader.h
index fdf7858f97f..f673cd0ee66 100644
--- a/intern/audaspace/intern/AUD_LinearResampleReader.h
+++ b/intern/audaspace/intern/AUD_LinearResampleReader.h
@@ -92,7 +92,7 @@ public:
virtual int getLength() const;
virtual int getPosition() const;
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_LINEARRESAMPLEREADER
diff --git a/intern/audaspace/intern/AUD_Mixer.cpp b/intern/audaspace/intern/AUD_Mixer.cpp
index 03488ac46b1..880e9d22e96 100644
--- a/intern/audaspace/intern/AUD_Mixer.cpp
+++ b/intern/audaspace/intern/AUD_Mixer.cpp
@@ -73,43 +73,33 @@ AUD_DeviceSpecs AUD_Mixer::getSpecs() const
return m_specs;
}
-void AUD_Mixer::add(sample_t* buffer, int start, int length, float volume)
+void AUD_Mixer::clear(int length)
{
- AUD_MixerBuffer buf;
- buf.buffer = buffer;
- buf.start = start;
- buf.length = length;
- buf.volume = volume;
- m_buffers.push_back(buf);
-}
-
-void AUD_Mixer::superpose(data_t* buffer, int length, float volume)
-{
- AUD_MixerBuffer buf;
+ if(m_buffer.getSize() < length * m_specs.channels * AUD_SAMPLE_SIZE(m_specs))
+ m_buffer.resize(length * m_specs.channels * AUD_SAMPLE_SIZE(m_specs));
- int channels = m_specs.channels;
+ m_length = length;
- if(m_buffer.getSize() < length * channels * 4)
- m_buffer.resize(length * channels * 4);
+ memset(m_buffer.getBuffer(), 0, length * m_specs.channels * AUD_SAMPLE_SIZE(m_specs));
+}
+void AUD_Mixer::mix(sample_t* buffer, int start, int length, float volume)
+{
sample_t* out = m_buffer.getBuffer();
- sample_t* in;
-
- memset(out, 0, length * channels * 4);
- int end;
+ length = (AUD_MIN(m_length, length + start) - start) * m_specs.channels;
+ start += m_specs.channels;
- while(!m_buffers.empty())
- {
- buf = m_buffers.front();
- m_buffers.pop_front();
+ for(int i = 0; i < length; i++)
+ out[i + start] += buffer[i] * volume;
+}
- end = buf.length * channels;
- in = buf.buffer;
+void AUD_Mixer::read(data_t* buffer, float volume)
+{
+ sample_t* out = m_buffer.getBuffer();
- for(int i = 0; i < end; i++)
- out[i + buf.start * channels] += in[i] * buf.volume * volume;
- }
+ for(int i = 0; i < m_length * m_specs.channels; i++)
+ out[i] *= volume;
- m_convert(buffer, (data_t*) out, length * channels);
+ m_convert(buffer, (data_t*) out, m_length * m_specs.channels);
}
diff --git a/intern/audaspace/intern/AUD_Mixer.h b/intern/audaspace/intern/AUD_Mixer.h
index d8c4dde2685..9e2be461452 100644
--- a/intern/audaspace/intern/AUD_Mixer.h
+++ b/intern/audaspace/intern/AUD_Mixer.h
@@ -36,15 +36,6 @@
#include "AUD_Buffer.h"
#include "AUD_Reference.h"
class AUD_IReader;
-#include <list>
-
-struct AUD_MixerBuffer
-{
- sample_t* buffer;
- int start;
- int length;
- float volume;
-};
/**
* This abstract class is able to mix audiosignals of different channel count
@@ -54,17 +45,17 @@ class AUD_Mixer
{
protected:
/**
- * The list of buffers to superpose.
+ * The output specification.
*/
- std::list<AUD_MixerBuffer> m_buffers;
+ const AUD_DeviceSpecs m_specs;
/**
- * The output specification.
+ * The length of the mixing buffer.
*/
- const AUD_DeviceSpecs m_specs;
+ int m_length;
/**
- * The temporary mixing buffer.
+ * The mixing buffer.
*/
AUD_Buffer m_buffer;
@@ -98,21 +89,26 @@ public:
virtual AUD_Reference<AUD_IReader> prepare(AUD_Reference<AUD_IReader> reader)=0;
/**
- * Adds a buffer for superposition.
+ * Mixes a buffer.
* \param buffer The buffer to superpose.
* \param start The start sample of the buffer.
* \param length The length of the buffer in samples.
* \param volume The mixing volume. Must be a value between 0.0 and 1.0.
*/
- virtual void add(sample_t* buffer, int start, int length, float volume);
+ virtual void mix(sample_t* buffer, int start, int length, float volume);
/**
- * Superposes all added buffers into an output buffer.
+ * Writes the mixing buffer into an output buffer.
* \param buffer The target buffer for superposing.
- * \param length The length of the buffer in samples.
* \param volume The mixing volume. Must be a value between 0.0 and 1.0.
*/
- virtual void superpose(data_t* buffer, int length, float volume);
+ virtual void read(data_t* buffer, float volume);
+
+ /**
+ * Clears the mixing buffer.
+ * \param length The length of the buffer in samples.
+ */
+ virtual void clear(int length);
};
#endif //AUD_MIXER
diff --git a/intern/audaspace/intern/AUD_SequencerReader.cpp b/intern/audaspace/intern/AUD_SequencerReader.cpp
index b7cbdda544e..794a524c527 100644
--- a/intern/audaspace/intern/AUD_SequencerReader.cpp
+++ b/intern/audaspace/intern/AUD_SequencerReader.cpp
@@ -113,21 +113,17 @@ AUD_Specs AUD_SequencerReader::getSpecs() const
return m_mixer->getSpecs().specs;
}
-void AUD_SequencerReader::read(int & length, sample_t* & buffer)
+void AUD_SequencerReader::read(int & length, sample_t* buffer)
{
AUD_DeviceSpecs specs = m_mixer->getSpecs();
- int samplesize = AUD_SAMPLE_SIZE(specs);
int rate = specs.rate;
- int size = length * samplesize;
-
int start, end, current, skip, len;
AUD_Reference<AUD_SequencerStrip> strip;
- sample_t* buf;
+ if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(specs))
+ m_buffer.resize(length * AUD_SAMPLE_SIZE(specs));
- if(m_buffer.getSize() < size)
- m_buffer.resize(size);
- buffer = m_buffer.getBuffer();
+ m_mixer->clear(length);
if(!m_factory->getMute())
{
@@ -176,8 +172,8 @@ void AUD_SequencerReader::read(int & length, sample_t* & buffer)
len -= skip;
if(strip->reader->getPosition() != current)
strip->reader->seek(current);
- strip->reader->read(len, buf);
- m_mixer->add(buf, skip, len, m_volume(m_data, strip->entry->data, (float)m_position / (float)rate));
+ strip->reader->read(len, m_buffer.getBuffer());
+ m_mixer->mix(m_buffer.getBuffer(), skip, len, m_volume(m_data, strip->entry->data, (float)m_position / (float)rate));
}
}
}
@@ -185,7 +181,7 @@ void AUD_SequencerReader::read(int & length, sample_t* & buffer)
}
}
- m_mixer->superpose((data_t*)buffer, length, 1.0f);
+ m_mixer->read((data_t*)buffer, 1.0f);
m_position += length;
}
diff --git a/intern/audaspace/intern/AUD_SequencerReader.h b/intern/audaspace/intern/AUD_SequencerReader.h
index 2efb94aa1fb..8b90c27ed9e 100644
--- a/intern/audaspace/intern/AUD_SequencerReader.h
+++ b/intern/audaspace/intern/AUD_SequencerReader.h
@@ -56,7 +56,7 @@ private:
int m_position;
/**
- * The sound output buffer.
+ * The reading buffer.
*/
AUD_Buffer m_buffer;
@@ -100,7 +100,7 @@ public:
virtual int getLength() const;
virtual int getPosition() const;
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_SEQUENCERREADER
diff --git a/intern/audaspace/intern/AUD_SilenceReader.cpp b/intern/audaspace/intern/AUD_SilenceReader.cpp
index bdff4fe75a6..cd109c2352c 100644
--- a/intern/audaspace/intern/AUD_SilenceReader.cpp
+++ b/intern/audaspace/intern/AUD_SilenceReader.cpp
@@ -66,15 +66,8 @@ AUD_Specs AUD_SilenceReader::getSpecs() const
return specs;
}
-void AUD_SilenceReader::read(int & length, sample_t* & buffer)
+void AUD_SilenceReader::read(int & length, sample_t* buffer)
{
- // resize if necessary
- if(m_buffer.getSize() < length * sizeof(sample_t))
- {
- m_buffer.resize(length * sizeof(sample_t));
- memset(m_buffer.getBuffer(), 0, m_buffer.getSize());
- }
-
- buffer = m_buffer.getBuffer();
+ memset(buffer, 0, length * sizeof(sample_t));
m_position += length;
}
diff --git a/intern/audaspace/intern/AUD_SilenceReader.h b/intern/audaspace/intern/AUD_SilenceReader.h
index b35b4cfab42..753cda896be 100644
--- a/intern/audaspace/intern/AUD_SilenceReader.h
+++ b/intern/audaspace/intern/AUD_SilenceReader.h
@@ -51,11 +51,6 @@ private:
*/
int m_position;
- /**
- * The playback buffer.
- */
- AUD_Buffer m_buffer;
-
// hide copy constructor and operator=
AUD_SilenceReader(const AUD_SilenceReader&);
AUD_SilenceReader& operator=(const AUD_SilenceReader&);
@@ -71,7 +66,7 @@ public:
virtual int getLength() const;
virtual int getPosition() const;
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_SILENCEREADER
diff --git a/intern/audaspace/intern/AUD_SinusReader.cpp b/intern/audaspace/intern/AUD_SinusReader.cpp
index f32464f067a..d8acd0f1a8f 100644
--- a/intern/audaspace/intern/AUD_SinusReader.cpp
+++ b/intern/audaspace/intern/AUD_SinusReader.cpp
@@ -72,14 +72,9 @@ AUD_Specs AUD_SinusReader::getSpecs() const
return specs;
}
-void AUD_SinusReader::read(int & length, sample_t* & buffer)
+void AUD_SinusReader::read(int & length, sample_t* buffer)
{
- // resize if necessary
- if(m_buffer.getSize() < length * sizeof(sample_t))
- m_buffer.resize(length * sizeof(sample_t));
-
// fill with sine data
- buffer = m_buffer.getBuffer();
for(int i = 0; i < length; i++)
{
buffer[i] = sin((m_position + i) * 2 * M_PI * m_frequency /
diff --git a/intern/audaspace/intern/AUD_SinusReader.h b/intern/audaspace/intern/AUD_SinusReader.h
index e807f03226d..dca00c15637 100644
--- a/intern/audaspace/intern/AUD_SinusReader.h
+++ b/intern/audaspace/intern/AUD_SinusReader.h
@@ -57,11 +57,6 @@ private:
int m_position;
/**
- * The playback buffer.
- */
- AUD_Buffer m_buffer;
-
- /**
* The sample rate for the output.
*/
const AUD_SampleRate m_sampleRate;
@@ -83,7 +78,7 @@ public:
virtual int getLength() const;
virtual int getPosition() const;
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_SINUSREADER
diff --git a/intern/audaspace/intern/AUD_SoftwareDevice.cpp b/intern/audaspace/intern/AUD_SoftwareDevice.cpp
index 82bb5841580..ff744f74973 100644
--- a/intern/audaspace/intern/AUD_SoftwareDevice.cpp
+++ b/intern/audaspace/intern/AUD_SoftwareDevice.cpp
@@ -104,17 +104,19 @@ void AUD_SoftwareDevice::destroy()
void AUD_SoftwareDevice::mix(data_t* buffer, int length)
{
+ if(m_buffer.getSize() < length * AUD_SAMPLE_SIZE(m_specs))
+ m_buffer.resize(length * AUD_SAMPLE_SIZE(m_specs));
+
lock();
{
AUD_SoftwareHandle* sound;
int len;
int pos;
- sample_t* buf;
std::list<AUD_SoftwareHandle*> stopSounds;
- std::list<AUD_Buffer*> tempBufs;
- AUD_Buffer* tempbuf;
- int samplesize = AUD_SAMPLE_SIZE(m_specs);
+ sample_t* buf = m_buffer.getBuffer();
+
+ m_mixer->clear(length);
// for all sounds
AUD_HandleIterator it = m_playingSounds.begin();
@@ -128,15 +130,13 @@ void AUD_SoftwareDevice::mix(data_t* buffer, int length)
// get the buffer from the source
pos = 0;
len = length;
+
sound->reader->read(len, buf);
// in case of looping
while(pos + len < length && sound->loopcount)
{
- tempbuf = new AUD_Buffer(len * samplesize);
- memcpy(tempbuf->getBuffer(), buf, len * samplesize);
- tempBufs.push_back(tempbuf);
- m_mixer->add(tempbuf->getBuffer(), pos, len, sound->volume);
+ m_mixer->mix(buf, pos, len, sound->volume);
pos += len;
@@ -153,7 +153,7 @@ void AUD_SoftwareDevice::mix(data_t* buffer, int length)
break;
}
- m_mixer->add(buf, pos, len, sound->volume);
+ m_mixer->mix(buf, pos, len, sound->volume);
pos += len;
// in case the end of the sound is reached
@@ -170,7 +170,7 @@ void AUD_SoftwareDevice::mix(data_t* buffer, int length)
}
// superpose
- m_mixer->superpose(buffer, length, m_volume);
+ m_mixer->read(buffer, m_volume);
// cleanup
while(!stopSounds.empty())
@@ -179,13 +179,6 @@ void AUD_SoftwareDevice::mix(data_t* buffer, int length)
stopSounds.pop_front();
stop(sound);
}
-
- while(!tempBufs.empty())
- {
- tempbuf = tempBufs.front();
- tempBufs.pop_front();
- delete tempbuf;
- }
}
unlock();
diff --git a/intern/audaspace/intern/AUD_SoftwareDevice.h b/intern/audaspace/intern/AUD_SoftwareDevice.h
index 6cbc6e3ddc6..6518afe6737 100644
--- a/intern/audaspace/intern/AUD_SoftwareDevice.h
+++ b/intern/audaspace/intern/AUD_SoftwareDevice.h
@@ -34,8 +34,8 @@
#include "AUD_IDevice.h"
#include "AUD_Mixer.h"
+#include "AUD_Buffer.h"
struct AUD_SoftwareHandle;
-class AUD_Buffer;
#include <list>
#include <pthread.h>
@@ -86,6 +86,11 @@ protected:
private:
/**
+ * The reading buffer.
+ */
+ AUD_Buffer m_buffer;
+
+ /**
* The list of sounds that are currently playing.
*/
std::list<AUD_SoftwareHandle*> m_playingSounds;
diff --git a/intern/audaspace/intern/AUD_StreamBufferFactory.cpp b/intern/audaspace/intern/AUD_StreamBufferFactory.cpp
index 5c4e024917b..1b96c97742b 100644
--- a/intern/audaspace/intern/AUD_StreamBufferFactory.cpp
+++ b/intern/audaspace/intern/AUD_StreamBufferFactory.cpp
@@ -45,7 +45,6 @@ AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_Reference<AUD_IFactory> fac
int sample_size = AUD_SAMPLE_SIZE(m_specs);
int length;
int index = 0;
- sample_t* buffer;
// get an approximated size if possible
int size = reader->getLength();
@@ -63,10 +62,7 @@ AUD_StreamBufferFactory::AUD_StreamBufferFactory(AUD_Reference<AUD_IFactory> fac
// read more
length = size-index;
- reader->read(length, buffer);
- memcpy(m_buffer->getBuffer() + index * m_specs.channels,
- buffer,
- length * sample_size);
+ reader->read(length, m_buffer->getBuffer() + index * m_specs.channels);
size += AUD_BUFFER_RESIZE_BYTES / sample_size;
index += length;
}
diff --git a/intern/audaspace/jack/AUD_JackDevice.cpp b/intern/audaspace/jack/AUD_JackDevice.cpp
index 03a740f5fbf..a8b2625b848 100644
--- a/intern/audaspace/jack/AUD_JackDevice.cpp
+++ b/intern/audaspace/jack/AUD_JackDevice.cpp
@@ -28,8 +28,6 @@
* \ingroup audjack
*/
-
-#include "AUD_Mixer.h"
#include "AUD_JackDevice.h"
#include "AUD_IReader.h"
diff --git a/intern/audaspace/sndfile/AUD_SndFileReader.cpp b/intern/audaspace/sndfile/AUD_SndFileReader.cpp
index 7b5fd7b0f45..cfe42b0725d 100644
--- a/intern/audaspace/sndfile/AUD_SndFileReader.cpp
+++ b/intern/audaspace/sndfile/AUD_SndFileReader.cpp
@@ -161,16 +161,8 @@ AUD_Specs AUD_SndFileReader::getSpecs() const
return m_specs;
}
-void AUD_SndFileReader::read(int & length, sample_t* & buffer)
+void AUD_SndFileReader::read(int & length, sample_t* buffer)
{
- int sample_size = AUD_SAMPLE_SIZE(m_specs);
-
- // resize output buffer if necessary
- if(m_buffer.getSize() < length*sample_size)
- m_buffer.resize(length*sample_size);
-
- buffer = m_buffer.getBuffer();
-
length = sf_readf_float(m_sndfile, buffer, length);
m_position += length;
diff --git a/intern/audaspace/sndfile/AUD_SndFileReader.h b/intern/audaspace/sndfile/AUD_SndFileReader.h
index af095819c0e..54ab05c63da 100644
--- a/intern/audaspace/sndfile/AUD_SndFileReader.h
+++ b/intern/audaspace/sndfile/AUD_SndFileReader.h
@@ -68,11 +68,6 @@ private:
AUD_Specs m_specs;
/**
- * The playback buffer.
- */
- AUD_Buffer m_buffer;
-
- /**
* The sndfile.
*/
SNDFILE* m_sndfile;
@@ -129,7 +124,7 @@ public:
virtual int getLength() const;
virtual int getPosition() const;
virtual AUD_Specs getSpecs() const;
- virtual void read(int & length, sample_t* & buffer);
+ virtual void read(int & length, sample_t* buffer);
};
#endif //AUD_SNDFILEREADER