Per Lohmann Poulsen
2009-Mar-03 10:59 UTC
[Speex-dev] speex_jitter_buffer and DTX (and multiple streams)
Hi, I have a few questions about the speex_jitter_buffer when used with DTX here goes: I want to use the speex_jitter_buffer with muliple streams (multi client) and with DTX so that clients will only transmit data when they are actually saying anything, but Im unsure of how the ticking is handled. I have 1 x SpeexJitter struct per client stream Im using portaudio and Im planning on using the callback to iterate through all the buffers getting decoded frames. There is no upper limit (in theory) to how many client streams/buffers there can be and as far as I can see the speex_jitter_get(..) performs quite a bit of code. In this case just to iterate through all buffers calling get(...) is quite inefficient so Im considering implementing a int buffer_has_data(SpeexJitter* jitter) { int count = 0; jitter_buffer_ctl(Jitter->packets, JITTER_BUFFER_GET_AVALIABLE_COUNT, &count); return count; } so I wouldnt use the speex_jitter_get(..) unless it had 1 or more packets, but would this ruin the ticking? Another reason for using this method is that I need to detect which client is saying anything as I want to merge the streams (after decode ofc). I have not exactly found out how yet, but Im considering -3db gain per stream (any hints would be appreciated =) ). If I were to use the speex_jitter_get(...) it would require checking the entire frame for 0/silence to determine if it should be merged (since there is no feedback, and I do not want to add silent streams because of the -3db gain) and since only 1 person is speaking in like 99% of the time that is a serious waste of CPU time. I presume that the client that is sending should not keep "ticking" when not sending, does the speex_jitter_get(...) take this into account (this is probably the essential question)? because there is no way for the buffer to know if it stopped sending or if its just dropped packets. e.g. (8000hz, 20ms frame, 160 samples per frame/tick) frame no. - timestamp frame 1 - 160 frame 2 - 320 frame 3 - 480 ...... frame n - n*160 (stopping transmission) ...... (starting transmission again) frame n+1 - (n+1)*160 frame n+2 - (n+2)*160 ..... etc Btw. the speex_jitter_buffer.h from the svn/speex/speexclient repository is missing a #ifdef __cplusplus extern "C" { #endif (if intended, then the "}" define should be removed) and the usual license (unless that is intended too) Best regards Per Lohmann -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.xiph.org/pipermail/speex-dev/attachments/20090303/8c4ba9b5/attachment.htm