* Music player: move music_worker to library * Music player: drop cli * Debug: speaker debug app * Debug: baudrate arg in uart_echo app * Libs: add music_worker to api * Libs: add music_worker to targets linker_dependencies Co-authored-by: あく <alleteam@gmail.com>
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <furi.h>
 | 
						|
#include <notification/notification.h>
 | 
						|
#include <music_worker/music_worker.h>
 | 
						|
#include <cli/cli.h>
 | 
						|
#include <toolbox/args.h>
 | 
						|
 | 
						|
#define TAG "SpeakerDebug"
 | 
						|
#define CLI_COMMAND "speaker_debug"
 | 
						|
 | 
						|
typedef enum {
 | 
						|
    SpeakerDebugAppMessageTypeStop,
 | 
						|
} SpeakerDebugAppMessageType;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    SpeakerDebugAppMessageType type;
 | 
						|
} SpeakerDebugAppMessage;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    MusicWorker* music_worker;
 | 
						|
    FuriMessageQueue* message_queue;
 | 
						|
    Cli* cli;
 | 
						|
} SpeakerDebugApp;
 | 
						|
 | 
						|
static SpeakerDebugApp* speaker_app_alloc() {
 | 
						|
    SpeakerDebugApp* app = (SpeakerDebugApp*)malloc(sizeof(SpeakerDebugApp));
 | 
						|
    app->music_worker = music_worker_alloc();
 | 
						|
    app->message_queue = furi_message_queue_alloc(8, sizeof(SpeakerDebugAppMessage));
 | 
						|
    app->cli = furi_record_open(RECORD_CLI);
 | 
						|
    return app;
 | 
						|
}
 | 
						|
 | 
						|
static void speaker_app_free(SpeakerDebugApp* app) {
 | 
						|
    music_worker_free(app->music_worker);
 | 
						|
    furi_message_queue_free(app->message_queue);
 | 
						|
    furi_record_close(RECORD_CLI);
 | 
						|
    free(app);
 | 
						|
}
 | 
						|
 | 
						|
static void speaker_app_cli(Cli* cli, FuriString* args, void* context) {
 | 
						|
    UNUSED(cli);
 | 
						|
 | 
						|
    SpeakerDebugApp* app = (SpeakerDebugApp*)context;
 | 
						|
    SpeakerDebugAppMessage message;
 | 
						|
    FuriString* cmd = furi_string_alloc();
 | 
						|
 | 
						|
    if(!args_read_string_and_trim(args, cmd)) {
 | 
						|
        furi_string_free(cmd);
 | 
						|
        printf("Usage:\r\n");
 | 
						|
        printf("\t" CLI_COMMAND " stop\r\n");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    if(furi_string_cmp(cmd, "stop") == 0) {
 | 
						|
        message.type = SpeakerDebugAppMessageTypeStop;
 | 
						|
        FuriStatus status = furi_message_queue_put(app->message_queue, &message, 100);
 | 
						|
        if(status != FuriStatusOk) {
 | 
						|
            printf("Failed to send message\r\n");
 | 
						|
        } else {
 | 
						|
            printf("Stopping\r\n");
 | 
						|
        }
 | 
						|
    } else {
 | 
						|
        printf("Usage:\r\n");
 | 
						|
        printf("\t" CLI_COMMAND " stop\r\n");
 | 
						|
    }
 | 
						|
 | 
						|
    furi_string_free(cmd);
 | 
						|
}
 | 
						|
 | 
						|
static bool speaker_app_music_play(SpeakerDebugApp* app, const char* rtttl) {
 | 
						|
    if(music_worker_is_playing(app->music_worker)) {
 | 
						|
        music_worker_stop(app->music_worker);
 | 
						|
    }
 | 
						|
 | 
						|
    if(!music_worker_load_rtttl_from_string(app->music_worker, rtttl)) {
 | 
						|
        FURI_LOG_E(TAG, "Failed to load RTTTL");
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    music_worker_set_volume(app->music_worker, 1.0f);
 | 
						|
    music_worker_start(app->music_worker);
 | 
						|
 | 
						|
    return true;
 | 
						|
}
 | 
						|
 | 
						|
static void speaker_app_music_stop(SpeakerDebugApp* app) {
 | 
						|
    if(music_worker_is_playing(app->music_worker)) {
 | 
						|
        music_worker_stop(app->music_worker);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void speaker_app_run(SpeakerDebugApp* app, const char* arg) {
 | 
						|
    if(!arg || !speaker_app_music_play(app, arg)) {
 | 
						|
        FURI_LOG_E(TAG, "Provided RTTTL is invalid");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    cli_add_command(app->cli, CLI_COMMAND, CliCommandFlagParallelSafe, speaker_app_cli, app);
 | 
						|
 | 
						|
    SpeakerDebugAppMessage message;
 | 
						|
    FuriStatus status;
 | 
						|
    while(true) {
 | 
						|
        status = furi_message_queue_get(app->message_queue, &message, FuriWaitForever);
 | 
						|
 | 
						|
        if(status == FuriStatusOk) {
 | 
						|
            if(message.type == SpeakerDebugAppMessageTypeStop) {
 | 
						|
                speaker_app_music_stop(app);
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    cli_delete_command(app->cli, CLI_COMMAND);
 | 
						|
}
 | 
						|
 | 
						|
int32_t speaker_debug_app(void* arg) {
 | 
						|
    SpeakerDebugApp* app = speaker_app_alloc();
 | 
						|
    speaker_app_run(app, arg);
 | 
						|
    speaker_app_free(app);
 | 
						|
    return 0;
 | 
						|
}
 |