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")); } <p><p>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@xiph.org' containing only the word 'unsubscribe' in the body. No subject is needed. Unsubscribe messages sent to the list will be ignored/filtered.
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")); > }-- Jean-Marc Valin, M.Sc.A., ing. jr. LABORIUS (http://www.gel.usherb.ca/laborius) Université de Sherbrooke, Québec, Canada -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 190 bytes Desc: Ceci est une partie de message numériquement signée. Url : http://lists.xiph.org/pipermail/speex-dev/attachments/20031219/07c5f3fe/signature-0001.pgp
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@xiph.org' containing only the word 'unsubscribe' in the body. No subject is needed. Unsubscribe messages sent to the list will be ignored/filtered.