[speex-dev] Please 30 second to look a my code
Steve Kann
stevek at stevek.com
Fri Dec 19 08:34:39 PST 2003
Also, it looks like he's recycling the same wave header for the raw PCM
and the speex-encoded files. Doesn't the wave header explain the audio
data format? It seems that if this wave header says the data is 16bit
PCM/8khz or whatever, and it really is speex-coded audio, a player
wouldn't have a chance to play it correctly.
-SteveK
<p>Jean-Marc Valin wrote:
>Well, you seem to be using FRAME_SIZE but only defining frame_size.
>Otherwise, the code looks OK, but it's always hard to tell. I suggest
>you start from speexenc/speexdec or from the example I wrote in the
>manual at: http://www.speex.org/manual/node12.html
>
> Jean-Marc
>
>Le ven 19/12/2003 à 05:22, Fabio a écrit :
>
>
>>Hi
>>i'm developing a sort of VoIP application
>>for my ipaq using speex...
>>I'm still at beginning and i have many problems encoding and decoding
>>my
>>wav files....output is only noise! Why?
>>
>>I'm using
>>Libspeex 1.1.3,
>>Embedded VisualC++ 3.0,
>>Ipaq 3850(206 MHz Intel® Strong ARM 32-bit RISC Processor) PocketPC
>>2002 (Windows CE 3.0).
>>
>>Libspeex is complied with the definition of FIXED_POINT...
>>
>>Regards
>>Fabio
>>
>>P.S.
>>Rodrigo did u do something similar?
>>
>>This is the code, what could be wrong?
>>void CRegistratoreDlg::OnEncode()
>>{
>> Sleep(500); //Wait because drawing send window
>>
>> SpeexBits bits;
>>
>> void *state;
>>
>> short InBuffer[FRAME_SIZE];
>> char OutBuffer[200];
>> char waveheader[WAVEHEADER];
>>
>> HANDLE WaveFile;
>> HANDLE SpeexFile;
>>
>> DWORD NrOfBytesRead, NrOfBytesWritten;
>>
>> char nrBytes = 0;
>> int nbBytes = 0;
>> int bit_rate, frame_size, test=0;
>> bool first=true;
>>
>> WaveFile = CreateFile(_T("\\Temp\\tempsound.wav"), GENERIC_READ, 0,
>>NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
>> SpeexFile = CreateFile(_T("\\Temp\\tempsound.spx"), GENERIC_WRITE, 0,
>>NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
>>
>> speex_bits_init(&bits); //init encoded bits buffer
>> state = speex_encoder_init(&speex_nb_mode); //Init encoder in
>>narrowband mode
>> speex_encoder_ctl(state, SPEEX_GET_FRAME_SIZE, &frame_size);//Get
>>frame size
>>
>> int tmp=0;
>> speex_encoder_ctl(state, SPEEX_SET_VBR, &tmp);
>> tmp=1;
>> speex_encoder_ctl(state, SPEEX_SET_COMPLEXITY, &tmp);
>>
>> bit_rate=24000;
>> speex_encoder_ctl(state, SPEEX_SET_BITRATE, &bit_rate);
>> ReadFile(WaveFile, waveheader, WAVEHEADER, &NrOfBytesRead, NULL);
>> WriteFile(SpeexFile, waveheader, WAVEHEADER, &NrOfBytesWritten,
>>NULL); //Raw copy of waveheader from speexfile to wavefile
>>
>> while(true)
>> {
>> ReadFile(WaveFile, InBuffer, FRAME_SIZE, &NrOfBytesRead, NULL);
>>//Fabio: Somewhere i found FRAME_SIZE * 2
>>
>> speex_bits_reset(&bits); //Reset out bits buffer
>> speex_encode(state, InBuffer, &bits); //Encode bits
>>
>> nbBytes = speex_bits_write(&bits, OutBuffer, 200); //Save
>>encoded bits to buffer
>>
>> if(first){ //First frame save the first byte, nrBytes, to
>>outfile
>> nrBytes = nbBytes;
>> WriteFile(SpeexFile, &nrBytes, 1, &NrOfBytesWritten, NULL);
>> first=false;
>> }
>>
>> WriteFile(SpeexFile, &OutBuffer, nbBytes, &NrOfBytesWritten,
>>NULL); //Write encoded buffer to outfile
>>
>> if(NrOfBytesRead<FRAME_SIZE) //Break if end of file
>> break;
>> }
>>
>> speex_bits_destroy(&bits); //Deallocate
>> speex_encoder_destroy(state);
>>
>> CloseHandle(WaveFile);
>> CloseHandle(SpeexFile);
>>
>> MessageBox(_T("Encoding Done"));
>>}
>>
>>
>>void CRegistratoreDlg::OnDecode()
>>{
>>
>> SpeexBits bits;
>>
>> void *state;
>>
>> char InBuffer[200];
>> short OutBuffer[FRAME_SIZE];
>> char waveheader[50];
>>
>> HANDLE InFile;
>> HANDLE OutFile;
>>
>> char nrBytes = 0;
>> int nbBytes = 0;
>>
>> DWORD NrOfBytesRead;
>> DWORD NrOfBytesWritten;
>>
>> InFile = CreateFile(_T("\\Temp\\tempsound.spx"), GENERIC_READ, 0,
>>NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
>>
>> //Create file to decode
>> OutFile = CreateFile(_T("\\Temp\\Dai.wav"), GENERIC_WRITE, 0, NULL,
>>CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // Create out wave file
>>
>> state = speex_decoder_init(&speex_nb_mode); //Init decoder in
>>//narrowband mode
>>
>> int tmp=0;
>> speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp);
>>
>> speex_bits_init(&bits); //Init out bit buffer
>>
>> ReadFile(InFile, waveheader, WAVEHEADER, &NrOfBytesRead, NULL); //Raw
>>copy of wave header
>>
>> WriteFile(OutFile, &waveheader, WAVEHEADER, &NrOfBytesWritten, NULL);
>>//from wave file to speexfile
>>
>> ReadFile(InFile, &nrBytes, 1, &NrOfBytesRead, NULL); //Read first
>>byte in frame to "nrBytes"
>>
>> nbBytes=nrBytes; //"nrBytes" gives info about used code rate
>>
>> while(1){ //Decode until end of file
>> ReadFile(InFile, InBuffer, nbBytes, &NrOfBytesRead, NULL);
>>//Read bits to decode
>>
>> speex_bits_read_from(&bits, InBuffer, nbBytes);
>>
>> speex_decode(state, &bits, OutBuffer); //Decode bits
>>
>> WriteFile(OutFile, OutBuffer, FRAME_SIZE*2, &NrOfBytesWritten,
>>NULL);
>>
>> if(NrOfBytesRead<nbBytes) //Break if end of file
>> break;
>> }
>>
>> speex_bits_destroy(&bits); //Deallocate
>> speex_decoder_destroy(state);
>>
>> CloseHandle(InFile);
>> CloseHandle(OutFile);
>>
>> MessageBox(_T("Decoding Done"));
>>}
>>
>>
--- >8 ----
List archives: http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'speex-dev-request at xiph.org'
containing only the word 'unsubscribe' in the body. No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.
More information about the Speex-dev
mailing list