mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-18 05:42:49 +00:00
a2dp_sink_demo: use start and stop stream
This commit is contained in:
parent
2760b1e821
commit
1bf4f2ab81
@ -279,6 +279,16 @@ static int a2dp_and_avrcp_setup(void){
|
|||||||
hci_event_callback_registration.callback = &hci_packet_handler;
|
hci_event_callback_registration.callback = &hci_packet_handler;
|
||||||
hci_add_event_handler(&hci_event_callback_registration);
|
hci_add_event_handler(&hci_event_callback_registration);
|
||||||
|
|
||||||
|
#ifdef HAVE_POSIX_FILE_IO
|
||||||
|
if (!btstack_audio_sink_get_instance()){
|
||||||
|
printf("No audio playback.\n");
|
||||||
|
} else {
|
||||||
|
printf("Audio playback supported.\n");
|
||||||
|
}
|
||||||
|
#ifdef STORE_SBC_TO_WAV_FILE
|
||||||
|
printf("Audio will be stored to \'%s\' file.\n", wav_filename);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,6 +303,11 @@ static void playback_handler(int16_t * buffer, uint16_t num_frames){
|
|||||||
|
|
||||||
// called from lower-layer but guaranteed to be on main thread
|
// called from lower-layer but guaranteed to be on main thread
|
||||||
|
|
||||||
|
if (sbc_frame_size == 0){
|
||||||
|
memset(buffer, 0, num_frames * BYTES_PER_FRAME);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// first fill from resampled audio
|
// first fill from resampled audio
|
||||||
uint32_t bytes_read;
|
uint32_t bytes_read;
|
||||||
btstack_ring_buffer_read(&decoded_audio_ring_buffer, (uint8_t *) buffer, num_frames * BYTES_PER_FRAME, &bytes_read);
|
btstack_ring_buffer_read(&decoded_audio_ring_buffer, (uint8_t *) buffer, num_frames * BYTES_PER_FRAME, &bytes_read);
|
||||||
@ -396,11 +411,31 @@ static int media_processing_init(avdtp_media_codec_configuration_sbc_t configura
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void media_processing_close(void){
|
static void media_processing_start(void){
|
||||||
|
if (!media_initialized) return;
|
||||||
|
// setup audio playback
|
||||||
|
const btstack_audio_sink_t * audio = btstack_audio_sink_get_instance();
|
||||||
|
if (audio){
|
||||||
|
audio->start_stream();
|
||||||
|
}
|
||||||
|
audio_stream_started = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void media_processing_pause(void){
|
||||||
|
if (!media_initialized) return;
|
||||||
|
// stop audio playback
|
||||||
|
audio_stream_started = 0;
|
||||||
|
const btstack_audio_sink_t * audio = btstack_audio_sink_get_instance();
|
||||||
|
if (audio){
|
||||||
|
audio->stop_stream();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void media_processing_close(void){
|
||||||
if (!media_initialized) return;
|
if (!media_initialized) return;
|
||||||
media_initialized = 0;
|
media_initialized = 0;
|
||||||
audio_stream_started = 0;
|
audio_stream_started = 0;
|
||||||
|
sbc_frame_size = 0;
|
||||||
|
|
||||||
#ifdef STORE_SBC_TO_WAV_FILE
|
#ifdef STORE_SBC_TO_WAV_FILE
|
||||||
wav_writer_close();
|
wav_writer_close();
|
||||||
@ -417,6 +452,7 @@ static void media_processing_close(void){
|
|||||||
// stop audio playback
|
// stop audio playback
|
||||||
const btstack_audio_sink_t * audio = btstack_audio_sink_get_instance();
|
const btstack_audio_sink_t * audio = btstack_audio_sink_get_instance();
|
||||||
if (audio){
|
if (audio){
|
||||||
|
printf("close stream\n");
|
||||||
audio->close();
|
audio->close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -621,22 +657,22 @@ static void avrcp_controller_packet_handler(uint8_t packet_type, uint16_t channe
|
|||||||
memset(value, 0, sizeof(value));
|
memset(value, 0, sizeof(value));
|
||||||
switch (packet[2]){
|
switch (packet[2]){
|
||||||
case AVRCP_SUBEVENT_NOTIFICATION_PLAYBACK_POS_CHANGED:
|
case AVRCP_SUBEVENT_NOTIFICATION_PLAYBACK_POS_CHANGED:
|
||||||
printf("AVRCP Controller: playback position changed, position %d ms\n", (unsigned int) avrcp_subevent_notification_playback_pos_changed_get_playback_position_ms(packet));
|
printf("AVRCP Controller: Playback position changed, position %d ms\n", (unsigned int) avrcp_subevent_notification_playback_pos_changed_get_playback_position_ms(packet));
|
||||||
break;
|
break;
|
||||||
case AVRCP_SUBEVENT_NOTIFICATION_PLAYBACK_STATUS_CHANGED:
|
case AVRCP_SUBEVENT_NOTIFICATION_PLAYBACK_STATUS_CHANGED:
|
||||||
printf("AVRCP Controller: playback status changed %s\n", avrcp_play_status2str(avrcp_subevent_notification_playback_status_changed_get_play_status(packet)));
|
printf("AVRCP Controller: Playback status changed %s\n", avrcp_play_status2str(avrcp_subevent_notification_playback_status_changed_get_play_status(packet)));
|
||||||
return;
|
return;
|
||||||
case AVRCP_SUBEVENT_NOTIFICATION_NOW_PLAYING_CONTENT_CHANGED:
|
case AVRCP_SUBEVENT_NOTIFICATION_NOW_PLAYING_CONTENT_CHANGED:
|
||||||
printf("AVRCP Controller: playing content changed\n");
|
printf("AVRCP Controller: Playing content changed\n");
|
||||||
return;
|
return;
|
||||||
case AVRCP_SUBEVENT_NOTIFICATION_TRACK_CHANGED:
|
case AVRCP_SUBEVENT_NOTIFICATION_TRACK_CHANGED:
|
||||||
printf("AVRCP Controller: track changed\n");
|
printf("AVRCP Controller: Track changed\n");
|
||||||
return;
|
return;
|
||||||
case AVRCP_SUBEVENT_NOTIFICATION_VOLUME_CHANGED:
|
case AVRCP_SUBEVENT_NOTIFICATION_VOLUME_CHANGED:
|
||||||
printf("AVRCP Controller: absolute volume changed %d\n", avrcp_subevent_notification_volume_changed_get_absolute_volume(packet));
|
printf("AVRCP Controller: Absolute volume changed %d\n", avrcp_subevent_notification_volume_changed_get_absolute_volume(packet));
|
||||||
return;
|
return;
|
||||||
case AVRCP_SUBEVENT_NOTIFICATION_AVAILABLE_PLAYERS_CHANGED:
|
case AVRCP_SUBEVENT_NOTIFICATION_AVAILABLE_PLAYERS_CHANGED:
|
||||||
printf("AVRCP Controller: changed\n");
|
printf("AVRCP Controller: Changed\n");
|
||||||
return;
|
return;
|
||||||
case AVRCP_SUBEVENT_SHUFFLE_AND_REPEAT_MODE:{
|
case AVRCP_SUBEVENT_SHUFFLE_AND_REPEAT_MODE:{
|
||||||
uint8_t shuffle_mode = avrcp_subevent_shuffle_and_repeat_mode_get_shuffle_mode(packet);
|
uint8_t shuffle_mode = avrcp_subevent_shuffle_and_repeat_mode_get_shuffle_mode(packet);
|
||||||
@ -696,7 +732,7 @@ static void avrcp_controller_packet_handler(uint8_t packet_type, uint16_t channe
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("AVRCP Controller: event 0x%02x is not parsed\n", packet[2]);
|
printf("AVRCP Controller: Event 0x%02x is not parsed\n", packet[2]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -883,30 +919,30 @@ static void a2dp_sink_packet_handler(uint8_t packet_type, uint16_t channel, uint
|
|||||||
cid = a2dp_subevent_stream_started_get_a2dp_cid(packet);
|
cid = a2dp_subevent_stream_started_get_a2dp_cid(packet);
|
||||||
if (cid != a2dp_cid) break;
|
if (cid != a2dp_cid) break;
|
||||||
a2dp_local_seid = a2dp_subevent_stream_started_get_local_seid(packet);
|
a2dp_local_seid = a2dp_subevent_stream_started_get_local_seid(packet);
|
||||||
printf("A2DP Sink : stream started\n");
|
printf("A2DP Sink : Stream started\n");
|
||||||
media_processing_init(sbc_configuration);
|
media_processing_start();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case A2DP_SUBEVENT_STREAM_SUSPENDED:
|
case A2DP_SUBEVENT_STREAM_SUSPENDED:
|
||||||
cid = a2dp_subevent_stream_suspended_get_a2dp_cid(packet);
|
cid = a2dp_subevent_stream_suspended_get_a2dp_cid(packet);
|
||||||
if (cid != a2dp_cid) break;
|
if (cid != a2dp_cid) break;
|
||||||
a2dp_local_seid = a2dp_subevent_stream_suspended_get_local_seid(packet);
|
a2dp_local_seid = a2dp_subevent_stream_suspended_get_local_seid(packet);
|
||||||
printf("A2DP Sink : stream paused\n");
|
printf("A2DP Sink : Stream paused\n");
|
||||||
// TODO: pause stream
|
media_processing_pause();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case A2DP_SUBEVENT_STREAM_RELEASED:
|
case A2DP_SUBEVENT_STREAM_RELEASED:
|
||||||
a2dp_local_seid = a2dp_subevent_stream_released_get_local_seid(packet);
|
a2dp_local_seid = a2dp_subevent_stream_released_get_local_seid(packet);
|
||||||
printf("A2DP Sink : stream released\n");
|
printf("A2DP Sink : Stream released\n");
|
||||||
media_processing_close();
|
media_processing_close();
|
||||||
break;
|
break;
|
||||||
case A2DP_SUBEVENT_SIGNALING_CONNECTION_RELEASED:
|
case A2DP_SUBEVENT_SIGNALING_CONNECTION_RELEASED:
|
||||||
cid = a2dp_subevent_signaling_connection_released_get_a2dp_cid(packet);
|
cid = a2dp_subevent_signaling_connection_released_get_a2dp_cid(packet);
|
||||||
printf("A2DP Sink : signaling connection released\n");
|
printf("A2DP Sink : Signaling connection released\n");
|
||||||
media_processing_close();
|
media_processing_close();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("A2DP Sink : not parsed 0x%02x\n", packet[2]);
|
printf("A2DP Sink : Not parsed 0x%02x\n", packet[2]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user