diff --git a/openrtx/include/core/audio_codec.h b/openrtx/include/core/audio_codec.h index acb67445..649e2375 100644 --- a/openrtx/include/core/audio_codec.h +++ b/openrtx/include/core/audio_codec.h @@ -31,6 +31,10 @@ extern "C" { /** * Initialise audio codec manager, allocating data buffers. + * + * This function allows recursive calls. However the number of times this + * function is called must be balanced by an equal number of calls to the + * terminate() function. */ void codec_init(); diff --git a/openrtx/src/core/audio_codec.c b/openrtx/src/core/audio_codec.c index 3dd436a9..f9a44159 100644 --- a/openrtx/src/core/audio_codec.c +++ b/openrtx/src/core/audio_codec.c @@ -32,6 +32,7 @@ static struct CODEC2 *codec2; static stream_sample_t *audioBuf; static streamId audioStream; +static uint8_t initCnt = 0; static bool running; static pthread_t codecThread; static pthread_mutex_t mutex; @@ -58,6 +59,15 @@ static void startThread(void *(*func) (void *)); void codec_init() { + if(initCnt > 0) + { + pthread_mutex_lock(&mutex); + initCnt += 1; + pthread_mutex_unlock(&mutex); + return; + } + + initCnt = 1; running = false; readPos = 0; writePos = 0; @@ -73,6 +83,11 @@ void codec_init() void codec_terminate() { + pthread_mutex_lock(&mutex); + initCnt -= 1; + pthread_mutex_unlock(&mutex); + + if(initCnt > 0) return; if(running) codec_stop(); pthread_mutex_destroy(&mutex);