rt-thread-official/bsp/stm32_radio/play_list.c

104 lines
2.5 KiB
C

#include "play_list.h"
#include "player_ui.h"
#include "mp3.h"
#include <string.h>
static struct play_item **play_list = RT_NULL;
static rt_uint16_t play_list_size = 0;
static rt_int16_t play_list_current = 0;
void play_list_clear()
{
rt_uint32_t index;
for (index = 0; index < play_list_size; index ++)
{
rt_free(play_list[index]->fn);
rt_free(play_list[index]);
play_list[index] = RT_NULL;
}
rt_free(play_list);
play_list = RT_NULL;
play_list_size = 0;
}
char* play_list_start()
{
play_list_current = 0;
return play_list[play_list_current]->fn;
}
rt_bool_t play_list_is_end()
{
if ((play_list_current == play_list_size - 1) ||
play_list_size == 0)
return RT_TRUE;
return RT_FALSE;
}
rt_uint32_t play_list_items(void)
{
return play_list_size;
}
struct play_item* play_list_item(rt_uint32_t n)
{
if (n > play_list_size) return RT_NULL;
return play_list[n];
}
void play_list_append(char* fn)
{
play_list_size ++;
if (play_list == RT_NULL)
play_list = (struct play_item**) rt_malloc (play_list_size * sizeof(struct play_item*));
else
play_list = (struct play_item**) rt_realloc(play_list, play_list_size * sizeof(struct play_item*));
play_list[play_list_size - 1] = (struct play_item*)rt_malloc(sizeof(struct play_item));
if (strstr(fn, ".mp3") != RT_NULL ||
strstr(fn, ".MP3") != RT_NULL)
{
struct tag_info info;
memset(&info, 0, sizeof(info));
mp3_get_info(fn, &info);
if (info.title[0] == '\0')
rt_snprintf(play_list[play_list_size - 1]->title, sizeof(play_list[play_list_size - 1]->title),
"<δ֪ÃûÒôÀÖ>");
else
strcpy(play_list[play_list_size - 1]->title, info.title);
play_list[play_list_size - 1]->fn = rt_strdup(fn);
play_list[play_list_size - 1]->duration = info.duration;
}
else
{
rt_snprintf(play_list[play_list_size - 1]->title, sizeof(play_list[play_list_size - 1]->title),
"<δ֪ÃûÒôÀÖ>");
play_list[play_list_size - 1]->fn = rt_strdup(fn);
play_list[play_list_size - 1]->duration = 0;
}
}
char* play_list_next()
{
if (play_list_current < play_list_size - 1) play_list_current ++;
return play_list[play_list_current]->fn;
}
char* play_list_prev()
{
if (play_list_current > 0) play_list_current --;
return play_list[play_list_current]->fn;
}
char* play_list_current_item()
{
return play_list[play_list_current]->fn;
}