@@ -75,38 +75,41 @@ class WavFile {
7575 void * getData (){
7676 return datachunk->id + sizeof (WavDataChunk);
7777 }
78- FloatArray createFloatArray (size_t channel){
78+ void read (size_t channel, FloatArray output ){
7979 size_t channels = getNumberOfChannels ();
80- size_t len = getNumberOfSamples ();
80+ size_t len = min (output. getSize (), getNumberOfSamples () );
8181 size_t pos = channel % channels;
82- FloatArray result = FloatArray::create (len);
8382 if (header->audio_format == 1 && header->bps == 8 ){ // WAVE_FORMAT_PCM 8-bit
8483 int8_t * data = (int8_t *)getData ();
8584 for (size_t i=0 ; i<len; ++i){
86- result [i] = (float )data[pos] / 128 .0f ;
85+ output [i] = (float )data[pos] / 128 .0f ;
8786 pos += channels;
8887 }
8988 }else if (header->audio_format == 1 && header->bps == 16 ){ // WAVE_FORMAT_PCM 16-bit
9089 int16_t * data = (int16_t *)getData ();
9190 for (size_t i=0 ; i<len; ++i){
92- result [i] = (float )data[pos] / 32768 .0f ;
91+ output [i] = (float )data[pos] / 32768 .0f ;
9392 pos += channels;
9493 }
9594 // todo: 24-bit data needs decoding
9695 // }else if(header->audio_format == 1 && header->bps == 24){ // WAVE_FORMAT_PCM 24-bit
9796 // int32_t* data = (int32_t*)getData();
9897 // for(size_t i=0; i<len; ++i){
99- // result [i] = (float)data[pos] / 8388608.0f;
98+ // output [i] = (float)data[pos] / 8388608.0f;
10099 // pos += channels;
101100 // }
102101 }else if (header->audio_format == 3 && header->bps == 32 ){ // WAVE_FORMAT_IEEE_FLOAT
103102 float * data = (float *)getData ();
104103 for (size_t i=0 ; i<len; ++i){
105- result [i] = data[pos];
104+ output [i] = data[pos];
106105 pos += channels;
107106 }
108107 }
109- return result;
108+ }
109+ FloatArray createFloatArray (size_t channel){
110+ FloatArray output = FloatArray::create (getNumberOfSamples ());
111+ read (channel, output);
112+ return output;
110113 }
111114};
112115
0 commit comments