summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOvnuniarchos <pujalte.jorge@gmail.com>2016-01-21 14:40:35 +0100
committerOvnuniarchos <pujalte.jorge@gmail.com>2016-01-21 14:40:58 +0100
commit8ed13c4df426331286687e2f45fecf7a2f0bf216 (patch)
treec1a01014502772f7be5a860fee92630483a8da13
parent432e7bf839c58c54d9191e22e93d5ae97e778ed9 (diff)
set_signed_data now works correctly on pcm8 samples.
-rw-r--r--doc/base/classes.xml1
-rw-r--r--servers/audio_server.cpp53
2 files changed, 40 insertions, 14 deletions
diff --git a/doc/base/classes.xml b/doc/base/classes.xml
index d6808f0f34..8128771b6a 100644
--- a/doc/base/classes.xml
+++ b/doc/base/classes.xml
@@ -4177,6 +4177,7 @@
<description>
Set the sample data for a given sample as an array of floats. The length must be equal to the sample lenght or an error will be produced.
For this method, a stereo sample is made from two samples. Thus, in case of a stereo sample, the array length must be twice the length returned by [method sample_get_length].
+ Trying to alter a SAMPLE_FORMAT_IMA_ADPCM sample is not supported. It will throw an error to the console, but will not alter the sample data.
</description>
</method>
<method name="sample_set_data">
diff --git a/servers/audio_server.cpp b/servers/audio_server.cpp
index 74f866afb7..1f0a2e403a 100644
--- a/servers/audio_server.cpp
+++ b/servers/audio_server.cpp
@@ -48,26 +48,51 @@ AudioServer *AudioServer::get_singleton() {
void AudioServer::sample_set_signed_data(RID p_sample, const DVector<float>& p_buffer) {
+ SampleFormat format = sample_get_format(p_sample);
+
+ ERR_EXPLAIN("IMA ADPCM is not supported.");
+ ERR_FAIL_COND(format==SAMPLE_FORMAT_IMA_ADPCM);
+
int len = p_buffer.size();
ERR_FAIL_COND( len == 0 );
DVector<uint8_t> data;
- data.resize(len*2);
- DVector<uint8_t>::Write w=data.write();
-
- int16_t *samples = (int16_t*)w.ptr();
-
+ DVector<uint8_t>::Write w;
DVector<float>::Read r = p_buffer.read();
- for(int i=0;i<len;i++) {
-
- float sample = r[i];
- sample = Math::floor( sample * (1<<16) );
- if (sample<-32768)
- sample=-32768;
- else if (sample>32767)
- sample=32767;
- samples[i]=sample;
+ switch(format) {
+ case SAMPLE_FORMAT_PCM8: {
+ data.resize(len);
+ w=data.write();
+
+ int8_t *samples8 = (int8_t*)w.ptr();
+
+ for(int i=0;i<len;i++) {
+
+ float sample = Math::floor( r[i] * (1<<8) );
+ if (sample<-128)
+ sample=-128;
+ else if (sample>127)
+ sample=127;
+ samples8[i]=sample;
+ }
+ } break;
+ case SAMPLE_FORMAT_PCM16: {
+ data.resize(len*2);
+ w=data.write();
+
+ int16_t *samples16 = (int16_t*)w.ptr();
+
+ for(int i=0;i<len;i++) {
+
+ float sample = Math::floor( r[i] * (1<<16) );
+ if (sample<-32768)
+ sample=-32768;
+ else if (sample>32767)
+ sample=32767;
+ samples16[i]=sample;
+ }
+ } break;
}
w = DVector<uint8_t>::Write();