set_signed_data now works correctly on pcm8 samples.
This commit is contained in:
parent
432e7bf839
commit
8ed13c4df4
2 changed files with 39 additions and 13 deletions
|
@ -4177,6 +4177,7 @@
|
||||||
<description>
|
<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.
|
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].
|
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>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="sample_set_data">
|
<method name="sample_set_data">
|
||||||
|
|
|
@ -48,26 +48,51 @@ AudioServer *AudioServer::get_singleton() {
|
||||||
|
|
||||||
void AudioServer::sample_set_signed_data(RID p_sample, const DVector<float>& p_buffer) {
|
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();
|
int len = p_buffer.size();
|
||||||
ERR_FAIL_COND( len == 0 );
|
ERR_FAIL_COND( len == 0 );
|
||||||
|
|
||||||
DVector<uint8_t> data;
|
DVector<uint8_t> data;
|
||||||
data.resize(len*2);
|
DVector<uint8_t>::Write w;
|
||||||
DVector<uint8_t>::Write w=data.write();
|
|
||||||
|
|
||||||
int16_t *samples = (int16_t*)w.ptr();
|
|
||||||
|
|
||||||
DVector<float>::Read r = p_buffer.read();
|
DVector<float>::Read r = p_buffer.read();
|
||||||
|
|
||||||
for(int i=0;i<len;i++) {
|
switch(format) {
|
||||||
|
case SAMPLE_FORMAT_PCM8: {
|
||||||
|
data.resize(len);
|
||||||
|
w=data.write();
|
||||||
|
|
||||||
float sample = r[i];
|
int8_t *samples8 = (int8_t*)w.ptr();
|
||||||
sample = Math::floor( sample * (1<<16) );
|
|
||||||
if (sample<-32768)
|
for(int i=0;i<len;i++) {
|
||||||
sample=-32768;
|
|
||||||
else if (sample>32767)
|
float sample = Math::floor( r[i] * (1<<8) );
|
||||||
sample=32767;
|
if (sample<-128)
|
||||||
samples[i]=sample;
|
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();
|
w = DVector<uint8_t>::Write();
|
||||||
|
|
Loading…
Reference in a new issue