#ifdef SUPPORT_MS_EXTENSIONS #pragma bss_seg(".key_tone_player.data.bss") #pragma data_seg(".key_tone_player.data") #pragma const_seg(".key_tone_player.text.const") #pragma code_seg(".key_tone_player.text") #endif #include "tone_player.h" #include "os/os_api.h" #include "system/init.h" #include "app_config.h" static struct tone_player *g_player = NULL; static OS_MUTEX g_mutex; static u8 g_play_cnt = 0; extern const struct stream_file_ops tone_file_ops; static void key_tone_player_callback(void *_player_id, int event) { switch (event) { case STREAM_EVENT_START: break; case STREAM_EVENT_PREEMPTED: break; case STREAM_EVENT_NEGOTIATE_FAILD: case STREAM_EVENT_STOP: struct tone_player *player = g_player; if (!player || player->player_id != (u8)_player_id) { break; } if (g_play_cnt) { g_play_cnt--; int err = jlstream_start(player->stream); if (err == 0) { break; } g_play_cnt = 0; } g_player = NULL; jlstream_release(player->stream); free(player); break; } } static int key_tone_player_start(struct tone_player *player) { int err = -EINVAL; u16 uuid = jlstream_event_notify(STREAM_EVENT_GET_PIPELINE_UUID, (int)"tone"); player->stream = jlstream_pipeline_parse(uuid, NODE_UUID_KEY_TONE); if (!player->stream) { goto __exit; } int player_id = player->player_id; jlstream_set_callback(player->stream, (void *)player_id, key_tone_player_callback); jlstream_set_scene(player->stream, player->scene); jlstream_set_dec_file(player->stream, player, &tone_file_ops); err = jlstream_start(player->stream); if (err) { goto __exit; } g_player = player; return 0; __exit: if (player->stream) { jlstream_release(player->stream); } if (player->file) { resfile_close(player->file); player->file = NULL; } free(player); return err; } int play_key_tone_file(const char *file_name) { struct tone_player *player; if (g_player) { if (g_play_cnt < 10) { g_play_cnt++; } return 0; } player = zalloc(sizeof(*player)); if (!player) { return -ENOMEM; } int err = tone_player_init(player, file_name); if (err) { free(player); return err; } player->scene = STREAM_SCENE_KEY_TONE; return key_tone_player_start(player); }