Hello,<br><br>I&#39;m having a problem using Speex - I&#39;m getting white noise/static from the following process:<br>(Load File) -&gt; (Encode) -&gt; (Decode) -&gt; (Play)<br><br>I know there&#39;s no issue with the loading or playing because (Load File)-&gt; (Play) plays the file properly.
<br><br>I believe the problem lies with the speex_bits_write and speex_bits_read_from functions, because if I change my encode function to return the whole SpeexBits struct and my decode function to accept a SpeexBits struct, it plays the vocoded audio without any problem.
<br><br><br>****************** Managed C++ Code ***********************************<br><br>//Public function -- m_encoderState is a void* member, m_bits is a SpeexBits* member<br>array&lt;Byte&gt;^ SpeexEncoder::Encode(array&lt;short&gt;^ inputFrame)
<br>{<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //begin lazy man&#39;s way of converting to regular C<br>&nbsp;&nbsp;&nbsp; unsigned int numSamples = inputFrame-&gt;Length;<br>&nbsp;&nbsp;&nbsp; short* inputptr = (short*) malloc(numSamples*sizeof(short));<br><br>&nbsp;&nbsp;&nbsp; unsigned int i = 0;
<br>&nbsp;&nbsp;&nbsp; for(i = 0; i&lt;numSamples; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputptr[i] = (short) inputFrame[i];<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //end lazy man&#39;s conversion<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; speex_bits_reset(m_bits);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //preprocess the input<br>&nbsp;&nbsp;&nbsp; //speex_preprocess(m_preprocess, inputptr);
<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //encode<br>&nbsp;&nbsp;&nbsp; speex_encode_int(m_encoderState, inputptr, m_bits); <br><br><br>&nbsp;&nbsp;&nbsp; char outputFrame[SPEEX_MAX_ENCODE_SIZE_PER_FRAME];<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; free(inputptr);<br><br>&nbsp;&nbsp;&nbsp; unsigned int numBytes = speex_bits_write(m_bits, outputFrame, SPEEX_MAX_ENCODE_SIZE_PER_FRAME);
<br><br>&nbsp;&nbsp; //begin lazy man&#39;s conversion to Managed C++<br>&nbsp;&nbsp;&nbsp; array&lt;Byte&gt;^ output = gcnew array&lt;Byte&gt;(numBytes);<br>&nbsp;&nbsp;&nbsp; for(i = 0; i&lt; numBytes; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output[i] = (unsigned char)outputFrame[i];
<br>&nbsp;&nbsp;&nbsp; //end lazy man&#39;s conversion<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; return output;<br>}<br><br><br><br><br>//Public function -- m_decoderState is a void* member, m_bits is a SpeexBits* member<br>
array&lt;short&gt;^ SpeexDecoder::Decode(array&lt;Byte&gt;^ inputBytes)<br>{<br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;
short* outputFrame = (short*) malloc(m_frameSize*sizeof(short));<br>&nbsp;&nbsp;&nbsp; speex_bits_reset(m_bits);<br>&nbsp;&nbsp;&nbsp; if(inputBytes != nullptr)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //begin lazy man&#39;s way of converting to regular C<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string input;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int inputLength = inputBytes-&gt;Length;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input.resize(inputLength);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int i = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i = 0; i&lt;inputLength; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input[i] = (unsigned char) inputBytes[i];
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //end lazy man&#39;s conversion<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; speex_bits_read_from(m_bits, (char*) input.c_str(), inputLength);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; speex_bits_read_from(m_bits, NULL, 0);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; //decode the data 
<br>&nbsp;&nbsp;&nbsp; speex_decode_int(m_decoderState, m_bits, (spx_int16_t*) outputFrame); <br><br>&nbsp;&nbsp; //begin lazy man&#39;s conversion to Managed C++<br>&nbsp; &nbsp; array&lt;short&gt;^ output = gcnew array&lt;short&gt;(m_frameSize);<br>&nbsp;&nbsp;&nbsp; int i = 0;
<br>&nbsp;&nbsp;&nbsp; for(i = 0; i&lt;m_frameSize; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output[i] = outputFrame[i];<br>&nbsp;&nbsp;&nbsp; free(outputFrame);<br>&nbsp;&nbsp; //end lazy man&#39;s conversion<br><br>&nbsp;&nbsp;&nbsp; return output;<br>}<br><br><br>************<br><br><br>Thanks for any help,
<br><br>Mark<br><br><br><br><br><br><br>