[speex-dev] SPEEX_SET_USER_HANDLER once again
Norman Biehl
n.biehl at gmx.de
Fri Nov 7 08:17:40 PST 2003
Hi,
Sorry! Marc Gimpel. I wrote it in a false thread before. It was my
first time. :-)
I have to write a small programm which should be able to record speeches
and in addition synchronize the recorded speeches with measuring data.
My idea is to record the speech in the normal way with speex and without
ogg. If a sync message was received, i write a custom in-band messages
using mode 13 into the stream. Furthermore, i fill a structure with the
sync data and write the structure into an array. To determine the
position
of the sync structure in the array, i have to write the array index of
the
sync structure into the stream. Inside the user callback i have to read
the array index of the reached sync point from the stream and send it
within a notification message to the application.
The Problem is, after the decoder reached the custom in-band messages
and
executed the user callback, the stream is corrupted and speex_decode()
returns -2.
I don't know where the problem is.
I can't find any sample code for custom in-band messages.
Is there anyone who can help?
Here some sample code:
/********************************** encoder
*********************************************/
// read raw data from serving buffer
void CSpeexEncoderThread::Decode(char * pcData, DWORD dwLength){
...
speex_encode(st, s, &bits); // encode
...
if (syncmsg == TRUE && synccount < 256){ // is there a sync
message?
syncstruct[synccount].sync_value = syncvalue; //fill the
sync structure
...
speex_bits_pack(&bits, 13, 5); //custom in-band messages
// write the array index of the sync structure into the
stream (max. 256
sync points)
speex_bits_pack(&bits, synccount, 8);
synccount++
}
nbBytes = speex_bits_write(&bits, cbits, MAX_FRAME_BYTES);
...
// write the encoded data into the end buffer
...
speex_bits_reset(&bits);
...
}
/********************************** encoder end
********************************************/
/************************************* decoder
*********************************************/
int CSpeexDecoderThread::SpeexUserCallback(SpeexBits *bits, void *state,
void *data){
...
// read the array index of the corresponding sync structure
int index = speex_bits_unpack_unsigned(bits, 8);
SendNotifyMessage(l_sdthread->m_hWnd, USER_PLAYBACK_MESSAGE,
SYNC_DATA,
LPARAM(index));
return 0;
}
inline int speex_bits_init_buffer_ex(SpeexBits *bits, void *buff, int
buf_size){
if (buff == NULL || buf_size == 0)
return -1;
memset(bits, 0, sizeof(SpeexBits));
bits->bytes = (char*)buff;
bits->buf_size = buf_size;
bits->nbBits=buf_size << 3;
return 0;
}
int CSpeexDecoderThread::DecodePlay(void* state, SpeexStereoState
stereo,
char* pcData, DWORD dwLength, int nchannels, int frame_size, int
ynccount){
...
if (synccount > 0){
callback.callback_id = 0;
callback.func = SpeexUserCallback;
callback.data = this;
speex_decoder_ctl(state, SPEEX_SET_USER_HANDLER,
&callback);
}
...
speex_bits_init_buffer_ex(&bits, pcData, dwLength);
while (1 == 1){
...
retval = speex_decode(state, &bits, output);
if (retval == -1){
return -1; //return DECODE_ENDOFSTREAM;
} else if (retval == -2){
return -2;
}
...
// play the sample
}
}
The second question, is there something wrong with the speex_uwb_mode
since version 1.1?
It don't work. Only speex_nb_mode and speex_wb_mode works.
Norman
ps: sorry for my pure english.
<p>--- >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