diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c index ca17437534..946eb16021 100644 --- a/apps/pcmbuf.c +++ b/apps/pcmbuf.c @@ -467,22 +467,20 @@ static size_t get_next_required_pcmbuf_size(void) } /* Initialize the pcmbuffer the structure looks like this: - * ...|---------PCMBUF---------|FADEBUF|VOICEBUF|DESCS|... */ + * ...|---------PCMBUF---------[|FADEBUF]|DESCS|... */ size_t pcmbuf_init(unsigned char *bufend) { - unsigned char *voicebuf; - pcmbuf_bufend = bufend; pcmbuf_size = get_next_required_pcmbuf_size(); write_chunk = (struct chunkdesc *)pcmbuf_bufend - NUM_CHUNK_DESCS(pcmbuf_size); - voicebuf = (unsigned char *)write_chunk - - voicebuf_init((unsigned char *)write_chunk); + #ifdef HAVE_CROSSFADE - fadebuf = voicebuf - CROSSFADE_BUFSIZE; + fadebuf = (unsigned char *)write_chunk - + (crossfade_enable_request ? CROSSFADE_BUFSIZE : 0); pcmbuffer = fadebuf - pcmbuf_size; #else - pcmbuffer = voicebuf - pcmbuf_size; + pcmbuffer = (unsigned char *)write_chunk - pcmbuf_size; #endif init_pcmbuffers(); diff --git a/apps/playback.c b/apps/playback.c index c74c606016..fe9bd579d4 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -738,7 +738,7 @@ static void audio_reset_buffer(void) { /* * Layout audio buffer as follows: - * [[|TALK]|SCRATCH|BUFFERING|PCM|] + * [[|TALK]|SCRATCH|BUFFERING|PCM|[VOICE|]] */ /* see audio_get_recording_buffer if this is modified */ @@ -755,6 +755,18 @@ static void audio_reset_buffer(void) ALIGN_BUFFER(filebuf, filebuflen, sizeof (intptr_t)); + if (talk_voice_required()) + { + /* Need a space for voice PCM output */ + allocsize = voicebuf_init(filebuf + filebuflen); + + allocsize = ALIGN_UP(allocsize, sizeof (intptr_t)); + if (allocsize > filebuflen) + goto bufpanic; + + filebuflen -= allocsize; + } + /* Subtract whatever the pcm buffer says it used plus the guard buffer */ allocsize = pcmbuf_init(filebuf + filebuflen); @@ -3475,7 +3487,7 @@ unsigned char * audio_get_buffer(bool talk_buf, size_t *buffer_size) swap space */ logf("get buffer: audio"); buf = audiobuf + talk_get_bufsize(); - end = audiobufend - pcmbuf_init(audiobufend); + end = audiobufend - voicebuf_init(audiobufend); buffer_state = AUDIOBUF_STATE_VOICED_ONLY; }