/main/play.c
#include <string.h>
#include <sys/time.h>
#include "freertos/FreeRTOS.h"
#include "esp_log.h"
#include "cwalk.h"
#include "browse.h"
#include "bt.h"
#include "flac.h"
#include "gfx.h"
#include "keyboard.h"
#include "play.h"
play_media_type_t media_type = PLAY_MEDIA_NONE;
TaskHandle_t play_task;
void play_set_media_type(play_media_type_t t) {
media_type = t;
}
play_state_t get_play_state() {
switch (media_type) {
case PLAY_MEDIA_BLUETOOTH:
return (play_state_t) bt_get_playback_state()->state;
default:
ESP_LOGE("PLAY", "Unfinished media type: %d", media_type);
return PLAY_STATE_ERROR;
}
}
void play_send_command(play_command_t c) {
switch (media_type) {
case PLAY_MEDIA_BLUETOOTH: {
esp_avrc_pt_cmd_t button;
switch (c) {
case PLAY_COMMAND_STOP:
button = ESP_AVRC_PT_CMD_STOP;
break;
case PLAY_COMMAND_PLAY:
button = ESP_AVRC_PT_CMD_PLAY;
break;
case PLAY_COMMAND_PAUSE:
button = ESP_AVRC_PT_CMD_PAUSE;
break;
case PLAY_COMMAND_RTRK:
button = ESP_AVRC_PT_CMD_BACKWARD;
break;
case PLAY_COMMAND_FTRK:
button = ESP_AVRC_PT_CMD_FORWARD;
break;
case PLAY_COMMAND_RREV:
button = ESP_AVRC_PT_CMD_REWIND;
break;
case PLAY_COMMAND_FFWD:
button = ESP_AVRC_PT_CMD_FAST_FORWARD;
break;
default:
return;
}
bt_send_key(button, ESP_AVRC_PT_CMD_STATE_PRESSED);
bt_send_key(button, ESP_AVRC_PT_CMD_STATE_RELEASED);
break;
}
default:
ESP_LOGE("PLAY", "Unfinished media type: %d", media_type);
}
}
void play_controller() {
key_event_t ke;
while (ke = key_get_event(0), !(ke.type == KEY_PRESSED && ke.code == KEY_BAND)) {
play_state_t ps = get_play_state();
if (ke.type == KEY_PRESSED) {
switch (ke.code) {
case KEY_SNOOZE:
if (ps == PLAY_STATE_PLAYING) {
play_send_command(PLAY_COMMAND_PAUSE);
} else {
play_send_command(PLAY_COMMAND_PLAY);
}
break;
case KEY_1:
play_send_command(PLAY_COMMAND_RTRK);
break;
case KEY_2:
play_send_command(PLAY_COMMAND_RREV);
break;
case KEY_3:
if (ps == PLAY_STATE_PLAYING) {
play_send_command(PLAY_COMMAND_PAUSE);
} else {
play_send_command(PLAY_COMMAND_PLAY);
}
break;
case KEY_4:
play_send_command(PLAY_COMMAND_FFWD);
break;
case KEY_5:
play_send_command(PLAY_COMMAND_FTRK);
break;
default:
break;
}
}
gfx_data_t* gd = gfx_acquire_data(SCENE_PLAY);
gd->play.play_state = ps;
gfx_release_data();
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}
void play_start_file_type(const char* filename, file_type_t file_type) {
play_parameters_t* pp = (play_parameters_t*) malloc(sizeof(play_parameters_t));
strncpy(pp->filename, filename, FILENAME_MAX);
switch (file_type) {
case FILE_TYPE_FLAC:
xTaskCreate(play_flac, "play_flac", 4096, pp, 1, &play_task);
break;
case FILE_TYPE_MP3:
printf("MP3 Unimplemented");
break;
}
}
void play_file(const char* filename) {
file_type_t file_type;
const char* extension;
size_t extension_len;
cwk_path_get_extension(filename, &extension, &extension_len);
if (strncmp(extension, ".flac", 6) == 0) {
file_type = FILE_TYPE_FLAC;
} else if (strncmp(extension, ".mp3", 5) == 0) {
file_type = FILE_TYPE_MP3;
} else {
ESP_LOGE("play_file", "Could not play %s", filename);
return;
}
printf("Playing %s\n", filename);
play_start_file_type(filename, file_type);
}