mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-08 04:27:12 +03:00
Finalize buttons for AirPlay and BT, worked on coexistence
This commit is contained in:
@@ -29,7 +29,7 @@
|
||||
#define LOCK_D mutex_lock(decode.mutex);
|
||||
#define UNLOCK_D mutex_unlock(decode.mutex);
|
||||
|
||||
enum { DECODE_BT = 1, DECODE_AIRPLAY };
|
||||
enum { DECODE_BT = 1, DECODE_RAOP };
|
||||
|
||||
extern struct outputstate output;
|
||||
extern struct decodestate decode;
|
||||
@@ -60,8 +60,8 @@ static void sink_data_handler(const uint8_t *data, uint32_t len)
|
||||
{
|
||||
size_t bytes, space;
|
||||
|
||||
// would be better to lock decoder, but really, it does not matter
|
||||
if (decode.state != DECODE_STOPPED) {
|
||||
// would be better to lock output, but really, it does not matter
|
||||
if (!output.external) {
|
||||
LOG_SDEBUG("Cannot use external sink while LMS is controlling player");
|
||||
return;
|
||||
}
|
||||
@@ -99,19 +99,18 @@ static void sink_data_handler(const uint8_t *data, uint32_t len)
|
||||
* BT sink command handler
|
||||
*/
|
||||
|
||||
static void bt_sink_cmd_handler(bt_sink_cmd_t cmd, ...)
|
||||
static bool bt_sink_cmd_handler(bt_sink_cmd_t cmd, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
LOCK_D;
|
||||
|
||||
if (decode.state != DECODE_STOPPED) {
|
||||
LOG_WARN("Cannot use BT sink while LMS is controlling player");
|
||||
UNLOCK_D;
|
||||
bt_sink_cmd(BT_SINK_DISCONNECTED);
|
||||
return;
|
||||
// don't LOCK_O as there is always a chance that LMS takes control later anyway
|
||||
if (output.external != DECODE_BT && output.state > OUTPUT_STOPPED) {
|
||||
LOG_WARN("Cannot use BT sink while LMS/AirPlay is controlling player");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
LOCK_D;
|
||||
|
||||
va_start(args, cmd);
|
||||
|
||||
if (cmd != BT_SINK_VOLUME) LOCK_O;
|
||||
@@ -120,12 +119,15 @@ static void bt_sink_cmd_handler(bt_sink_cmd_t cmd, ...)
|
||||
case BT_SINK_CONNECTED:
|
||||
output.external = DECODE_BT;
|
||||
output.state = OUTPUT_STOPPED;
|
||||
output.frames_played = 0;
|
||||
_buf_flush(outputbuf);
|
||||
bt_master(true);
|
||||
LOG_INFO("BT sink started");
|
||||
break;
|
||||
case BT_SINK_DISCONNECTED:
|
||||
if (output.external == DECODE_BT) {
|
||||
output.external = 0;
|
||||
output.state = OUTPUT_OFF;
|
||||
bt_master(false);
|
||||
LOG_INFO("BT sink stopped");
|
||||
}
|
||||
break;
|
||||
@@ -155,6 +157,7 @@ static void bt_sink_cmd_handler(bt_sink_cmd_t cmd, ...)
|
||||
UNLOCK_D;
|
||||
|
||||
va_end(args);
|
||||
return true;
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
@@ -171,15 +174,15 @@ static void raop_sink_data_handler(const uint8_t *data, uint32_t len, u32_t play
|
||||
/****************************************************************************************
|
||||
* AirPlay sink command handler
|
||||
*/
|
||||
void raop_sink_cmd_handler(raop_event_t event, void *param)
|
||||
static bool raop_sink_cmd_handler(raop_event_t event, void *param)
|
||||
{
|
||||
LOCK_D;
|
||||
|
||||
if (decode.state != DECODE_STOPPED) {
|
||||
LOG_WARN("Cannot use Airplay sink while LMS is controlling player");
|
||||
UNLOCK_D;
|
||||
return;
|
||||
// don't LOCK_O as there is always a chance that LMS takes control later anyway
|
||||
if (output.external != DECODE_RAOP && output.state > OUTPUT_STOPPED) {
|
||||
LOG_WARN("Cannot use Airplay sink while LMS/BT is controlling player");
|
||||
return false;
|
||||
}
|
||||
|
||||
LOCK_D;
|
||||
|
||||
if (event != RAOP_VOLUME) LOCK_O;
|
||||
|
||||
@@ -233,6 +236,10 @@ void raop_sink_cmd_handler(raop_event_t event, void *param)
|
||||
case RAOP_SETUP:
|
||||
// we need a fair bit of space for RTP process
|
||||
_buf_resize(outputbuf, RAOP_OUTPUT_SIZE);
|
||||
output.frames_played = 0;
|
||||
output.external = DECODE_RAOP;
|
||||
output.state = OUTPUT_STOPPED;
|
||||
raop_master(true);
|
||||
LOG_INFO("resizing buffer %u", outputbuf->size);
|
||||
break;
|
||||
case RAOP_STREAM:
|
||||
@@ -242,16 +249,14 @@ void raop_sink_cmd_handler(raop_event_t event, void *param)
|
||||
raop_sync.idx = 0;
|
||||
raop_sync.start = true;
|
||||
raop_sync.enabled = !strcasestr(output.device, "BT");
|
||||
output.external = DECODE_AIRPLAY;
|
||||
output.next_sample_rate = output.current_sample_rate = RAOP_SAMPLE_RATE;
|
||||
output.state = OUTPUT_STOPPED;
|
||||
break;
|
||||
case RAOP_STOP:
|
||||
LOG_INFO("Stop", NULL);
|
||||
output.external = 0;
|
||||
output.state = OUTPUT_OFF;
|
||||
output.frames_played = 0;
|
||||
raop_state = event;
|
||||
raop_master(false);
|
||||
break;
|
||||
case RAOP_FLUSH:
|
||||
LOG_INFO("Flush", NULL);
|
||||
@@ -286,6 +291,7 @@ void raop_sink_cmd_handler(raop_event_t event, void *param)
|
||||
if (event != RAOP_VOLUME) UNLOCK_O;
|
||||
|
||||
UNLOCK_D;
|
||||
return true;
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
@@ -300,7 +306,7 @@ void register_external(void) {
|
||||
} else {
|
||||
LOG_WARN("Cannot be a BT sink and source");
|
||||
}
|
||||
if(enable_airplay){
|
||||
if (enable_airplay){
|
||||
raop_sink_init(raop_sink_cmd_handler, raop_sink_data_handler);
|
||||
LOG_INFO("Initializing AirPlay sink");
|
||||
}
|
||||
@@ -311,8 +317,21 @@ void deregister_external(void) {
|
||||
bt_sink_deinit();
|
||||
LOG_INFO("Stopping BT sink");
|
||||
}
|
||||
if(enable_airplay){
|
||||
if (enable_airplay){
|
||||
raop_sink_deinit();
|
||||
LOG_INFO("Stopping AirPlay sink");
|
||||
}
|
||||
}
|
||||
|
||||
void decode_resume(int external) {
|
||||
switch (external) {
|
||||
case DECODE_BT:
|
||||
bt_disconnect();
|
||||
break;
|
||||
case DECODE_RAOP:
|
||||
raop_disconnect();
|
||||
raop_state = RAOP_STOP;
|
||||
break;
|
||||
}
|
||||
_buf_resize(outputbuf, output.init_size);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user