fix(audio): prevent empty session replay
This commit is contained in:
@@ -423,12 +423,16 @@ void vad_audio_process(void) {
|
|||||||
{
|
{
|
||||||
size_t first = (vad_preroll_next + VAD_PREROLL_FRAMES - vad_preroll_count) % VAD_PREROLL_FRAMES;
|
size_t first = (vad_preroll_next + VAD_PREROLL_FRAMES - vad_preroll_count) % VAD_PREROLL_FRAMES;
|
||||||
size_t n;
|
size_t n;
|
||||||
|
int preroll_queued = 0;
|
||||||
for (n = 0; n < vad_preroll_count; n++) {
|
for (n = 0; n < vad_preroll_count; n++) {
|
||||||
size_t frame_index = (first + n) % VAD_PREROLL_FRAMES;
|
size_t frame_index = (first + n) % VAD_PREROLL_FRAMES;
|
||||||
if (hal_os_rb_write(ring_sender, vad_preroll[frame_index], VAD_FRAME_BYTES, 25) > 0) {
|
if (hal_os_rb_write(ring_sender, vad_preroll[frame_index], VAD_FRAME_BYTES, 25) > 0) {
|
||||||
ql_rtos_semaphore_release(sender_sem);
|
preroll_queued = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (preroll_queued) {
|
||||||
|
ql_rtos_semaphore_release(sender_sem);
|
||||||
|
}
|
||||||
vad_preroll_count = 0;
|
vad_preroll_count = 0;
|
||||||
}
|
}
|
||||||
set_state(STATE_RECORDING_ACTIVE);
|
set_state(STATE_RECORDING_ACTIVE);
|
||||||
|
|||||||
@@ -1367,6 +1367,14 @@ sender_loop:
|
|||||||
|
|
||||||
if(!app_get_data_call_net_status()) continue;
|
if(!app_get_data_call_net_status()) continue;
|
||||||
|
|
||||||
|
/* One recording can release the semaphore many times while the sender
|
||||||
|
* drains the ring buffer. A stale token must never create an empty
|
||||||
|
* session after the previous encoder has already been closed. */
|
||||||
|
left = rb_get_space_used(ring_sender);
|
||||||
|
if(shine_init == 0 && left <= 0){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if(shine_init==0){
|
if(shine_init==0){
|
||||||
shine_set_config_mpeg_defaults(&(sh_config.mpeg)); //--init sh_config struct
|
shine_set_config_mpeg_defaults(&(sh_config.mpeg)); //--init sh_config struct
|
||||||
sh_config.wave.channels=PCM_MONO; //PCM_STEREO;//PCM_MONO;
|
sh_config.wave.channels=PCM_MONO; //PCM_STEREO;//PCM_MONO;
|
||||||
@@ -1420,6 +1428,9 @@ sender_loop:
|
|||||||
shine_init = 0;
|
shine_init = 0;
|
||||||
|
|
||||||
audio_packet_type = 0;
|
audio_packet_type = 0;
|
||||||
|
/* Discard semaphore tokens already represented by the PCM that this
|
||||||
|
* session drained. Recording has stopped, so no new frames race here. */
|
||||||
|
while(ql_rtos_semaphore_wait(sender_sem, 0) == 0) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user