static void close_media_processing(void){ if (!media_initialized) return; media_initialized = 0; #ifdef STORE_SBC_TO_WAV_FILE printf(" Close wav writer.\n"); wav_writer_close(); int total_frames_nr = state.good_frames_nr + state.bad_frames_nr + state.zero_frames_nr; printf(" Decoding done. Processed totaly %d frames:\n - %d good\n - %d bad\n - %d zero frames\n", total_frames_nr, state.good_frames_nr, state.bad_frames_nr, state.zero_frames_nr); printf(" Written %d frames to wav file: %s\n\n", frame_count, wav_filename); #endif #ifdef STORE_SBC_TO_SBC_FILE fclose(sbc_file); #endif #ifdef HAVE_PORTAUDIO PaError err = Pa_StopStream(stream); if (err != paNoError){ printf("Error stopping the stream: \"%s\"\n", Pa_GetErrorText(err)); return; } pa_stream_started = 0; err = Pa_CloseStream(stream); if (err != paNoError){ printf("Error closing the stream: \"%s\"\n", Pa_GetErrorText(err)); return; } err = Pa_Terminate(); if (err != paNoError){ printf("Error terminating portaudio: \"%s\"\n", Pa_GetErrorText(err)); return; } #endif }
void sco_demo_close(void){ printf("SCO demo close\n"); printf("SCO demo statistics: "); #ifdef ENABLE_HFP_WIDE_BAND_SPEECH if (negotiated_codec == HFP_CODEC_MSBC){ printf("Used mSBC with PLC, number of processed frames: \n - %d good frames, \n - %d zero frames, \n - %d bad frames.\n", decoder_state.good_frames_nr, decoder_state.zero_frames_nr, decoder_state.bad_frames_nr); } else #endif { printf("Used CVSD with PLC, number of proccesed frames: \n - %d good frames, \n - %d bad frames.\n", cvsd_plc_state.good_frames_nr, cvsd_plc_state.bad_frames_nr); } negotiated_codec = -1; #if (SCO_DEMO_MODE == SCO_DEMO_MODE_SINE) || (SCO_DEMO_MODE == SCO_DEMO_MODE_MICROPHONE) #if defined(SCO_WAV_FILENAME) wav_writer_close(); #endif #ifdef HAVE_PORTAUDIO portaudio_terminate(); #endif #endif }
static void handle_pcm_data(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context){ UNUSED(context); UNUSED(sample_rate); UNUSED(data); UNUSED(num_samples); UNUSED(num_channels); #if (SCO_DEMO_MODE == SCO_DEMO_MODE_SINE) || (SCO_DEMO_MODE == SCO_DEMO_MODE_MICROPHONE) // printf("handle_pcm_data num samples %u, sample rate %d\n", num_samples, num_channels); #ifdef HAVE_PORTAUDIO // samples in callback in host endianess, ready for PortAudio playback btstack_ring_buffer_write(&pa_output_ring_buffer, (uint8_t *)data, num_samples*num_channels*2); #endif /* HAVE_PORTAUDIO */ #ifdef SCO_WAV_FILENAME if (!num_samples_to_write) return; num_samples = btstack_min(num_samples, num_samples_to_write); num_samples_to_write -= num_samples; wav_writer_write_int16(num_samples, data); if (num_samples_to_write == 0){ wav_writer_close(); } #endif /* SCO_WAV_FILENAME */ #endif /* Demo mode sine or microphone */ }
static void media_processing_close(void){ if (is_media_initialized) return; is_media_initialized = 0; #ifdef STORE_SBC_TO_WAV_FILE wav_writer_close(); int total_frames_nr = state.good_frames_nr + state.bad_frames_nr + state.zero_frames_nr; printf("WAV Writer: Decoding done. Processed totaly %d frames:\n - %d good\n - %d bad\n", total_frames_nr, state.good_frames_nr, total_frames_nr - state.good_frames_nr); printf("WAV Writer: Written %d frames to wav file: %s\n", frame_count, wav_filename); #endif #ifdef STORE_SBC_TO_SBC_FILE fclose(sbc_file); #endif #if defined(HAVE_PORTAUDIO) || defined (HAVE_AUDIO_DMA) audio_stream_started = 0; #endif #ifdef HAVE_PORTAUDIO printf("PortAudio: Stream closed\n"); log_info("PortAudio: Stream closed"); PaError err = Pa_StopStream(stream); if (err != paNoError){ printf("Error stopping the stream: \"%s\"\n", Pa_GetErrorText(err)); log_error("Error stopping the stream: \"%s\"", Pa_GetErrorText(err)); return; } err = Pa_CloseStream(stream); if (err != paNoError){ printf("Error closing the stream: \"%s\"\n", Pa_GetErrorText(err)); log_error("Error closing the stream: \"%s\"", Pa_GetErrorText(err)); return; } err = Pa_Terminate(); if (err != paNoError){ printf("Error terminating portaudio: \"%s\"\n", Pa_GetErrorText(err)); log_error("Error terminating portaudio: \"%s\"", Pa_GetErrorText(err)); return; } #endif #ifdef HAVE_AUDIO_DMA hal_audio_dma_close(); #endif }
static void sco_demo_receive_CVSD(uint8_t * packet, uint16_t size){ if (!num_samples_to_write) return; int16_t audio_frame_out[128]; // if (size > sizeof(audio_frame_out)){ printf("sco_demo_receive_CVSD: SCO packet larger than local output buffer - dropping data.\n"); return; } #if defined(SCO_WAV_FILENAME) || defined(USE_PORTAUDIO) const int audio_bytes_read = size - 3; const int num_samples = audio_bytes_read / CVSD_BYTES_PER_FRAME; // convert into host endian int16_t audio_frame_in[128]; int i; for (i=0;i<num_samples;i++){ audio_frame_in[i] = little_endian_read_16(packet, 3 + i * 2); } btstack_cvsd_plc_process_data(&cvsd_plc_state, audio_frame_in, num_samples, audio_frame_out); #endif #ifdef SCO_WAV_FILENAME // Samples in CVSD SCO packet are in little endian, ready for wav files (take shortcut) const int samples_to_write = btstack_min(num_samples, num_samples_to_write); wav_writer_write_le_int16(samples_to_write, audio_frame_out); num_samples_to_write -= samples_to_write; if (num_samples_to_write == 0){ wav_writer_close(); } #endif #ifdef USE_PORTAUDIO btstack_ring_buffer_write(&pa_output_ring_buffer, (uint8_t *)audio_frame_out, audio_bytes_read); #endif }
static void write_wav_data(int16_t * data, int num_frames, int num_channels, int sample_rate){ (void)sample_rate; wav_writer_write_int16(num_frames*num_channels, data); total_num_samples+=num_frames*num_channels; if (total_num_samples>5*SAMPLE_RATE) wav_writer_close(); }