1 /*
2  * Copyright (C) 2020-2023 Alibaba Group Holding Limited
3  */
4 #include <stdio.h>
5 #include <stdint.h>
6 #include <stdbool.h>
7 #include <ulog/ulog.h>
8 #include "uvoice_init.h"
9 #include "uvoice_types.h"
10 #include "uvoice_event.h"
11 #include "uvoice_player.h"
12 #include "uvoice_recorder.h"
13 #include "ulog/ulog.h"
14 #include "aos/kernel.h"
15 #include "uvoice_os.h"
16 #include "player.h"
17 
18 #define TAG "player"
19 static aos_task_t play_task;
20 static uvoice_player_t *uvocplayer;
21 static char text_source[256];
22 static player_cb_t play_done_cb = NULL;
23 static player_mp3_e g_file = PLAYER_MP3_MAX;
24 
25 extern int audio_install_codec_driver();
26 
get_format_from_name(char * name,media_format_t * format)27 static int get_format_from_name(char *name, media_format_t *format)
28 {
29     if (!name || !format) {
30         LOGE(TAG, "arg null !\n");
31         return -1;
32     }
33 
34     if (strstr(name, ".mp3") || strstr(name, ".MP3"))
35         *format = MEDIA_FMT_MP3;
36     else if (strstr(name, ".wav") || strstr(name, ".WAV"))
37         *format = MEDIA_FMT_WAV;
38     else if (strstr(name, ".aac") || strstr(name, ".AAC"))
39         *format = MEDIA_FMT_AAC;
40     else if (strstr(name, ".m4a") || strstr(name, ".M4A"))
41         *format = MEDIA_FMT_M4A;
42     else if (strstr(name, ".pcm") || strstr(name, ".PCM"))
43         *format = MEDIA_FMT_PCM;
44     else if (strstr(name, ".spx") || strstr(name, ".SPX"))
45         *format = MEDIA_FMT_SPX;
46     else if (strstr(name, ".ogg") || strstr(name, ".OGG"))
47         *format = MEDIA_FMT_OGG;
48     else if (strstr(name, ".amrwb") || strstr(name, ".AMRWB"))
49         *format = MEDIA_FMT_AMRWB;
50     else if (strstr(name, ".amr") || strstr(name, ".AMR"))
51         *format = MEDIA_FMT_AMR;
52     else if (strstr(name, ".opus") || strstr(name, ".OPUS"))
53         *format = MEDIA_FMT_OPS;
54     else if (strstr(name, ".flac") || strstr(name, ".FLAC"))
55         *format = MEDIA_FMT_FLAC;
56 
57     return 0;
58 }
59 
play_music(void * arg)60 static void *play_music(void *arg)
61 {
62     media_format_t format = MEDIA_FMT_UNKNOWN;
63     get_format_from_name(text_source, &format);
64 
65     if (uvocplayer->set_source(text_source)) {
66         LOGE(TAG, "set source failed !\n");
67         return NULL;
68     }
69 
70     if (uvocplayer->start()) {
71         LOGE(TAG, "start failed !\n");
72         uvocplayer->clr_source();
73     }
74 
75     // uvocplayer->wait_complete();
76 
77     if (play_done_cb)
78         play_done_cb(g_file);
79 
80     return NULL;
81 }
82 
83 
player_play(player_mp3_e file)84 int32_t player_play(player_mp3_e file)
85 {
86     int32_t random;
87 
88     random = rand() % 240;
89     LOG("random: %d\n", random);
90     memset(text_source, 0, sizeof(text_source));
91     if (file == PLAYER_MP3_WELCOME) {
92         strcpy(text_source, "fs:/data/mp3/welcome.mp3");
93     } else if (file == PLAYER_MP3_WAKEUP) {
94         // if (random < 100) {
95             // strcpy(text_source, "fs:/data/mp3/haas_intro.mp3");
96         // } else
97         if (random > 0 && random < 150) {
98             strcpy(text_source, "fs:/data/mp3/zhurenyoushenmkeyibangnin.mp3");
99         } else if (random > 150 && random < 200) {
100             strcpy(text_source, "fs:/data/mp3/zhurenwozai.mp3");
101         } else {
102             strcpy(text_source, "fs:/data/mp3/eiwozai.mp3");
103         }
104         g_file = PLAYER_MP3_WAKEUP;
105     } else if (file == PLAYER_MP3_LIGHT_ON) {
106         strcpy(text_source, "fs:/data/mp3/haodeyiweinindakai.mp3");
107         g_file = PLAYER_MP3_LIGHT_ON;
108     } else if (file == PLAYER_MP3_LIGHT_OFF) {
109         strcpy(text_source, "fs:/data/mp3/haodeyiweininguanbi.mp3");
110         g_file = PLAYER_MP3_LIGHT_OFF;
111     }
112 
113 #if 1
114     /*set player enter idle state after a long time*/
115     uvocplayer->set_standby(2147483646);
116 
117     play_music(NULL);
118     uvocplayer->wait_complete();
119     aos_msleep(500);
120 #else
121     aos_task_new_ext(&play_task,
122         "play music task", play_music,
123         NULL, 8192, 0);
124 #endif
125     return 0;
126 }
127 
player_stop(void)128 int32_t player_stop(void)
129 {
130     player_state_t state;
131 
132     /*stop and clear current playing*/
133     uvocplayer->set_fade(40, 40);
134     uvocplayer->stop_async();
135     uvocplayer->clr_source();
136 
137 }
138 
139 
player_wait_complete(void)140 int32_t player_wait_complete(void)
141 {
142     int32_t ret;
143 
144     ret = uvocplayer->wait_complete();
145     if (ret < 0)
146         aos_msleep(1000);
147     aos_msleep(500);
148 }
149 
player_init(player_cb_t cb)150 int32_t player_init(player_cb_t cb)
151 {
152     int32_t ret;
153 
154     /*Init uvoice to play mp3*/
155     ret = uvoice_init();
156     if (ret < 0) {
157         LOGE(TAG, "uvoice_init failed !\n");
158         return -1;
159     }
160 
161     /*create uvoice player*/
162     uvocplayer = uvoice_player_create();
163     if (!uvocplayer) {
164         LOGE(TAG, "create media player failed !\n");
165         return -1;
166     }
167     /*set eq*/
168     uvocplayer->eq_enable(0);
169 
170     /*set play volume*/
171     uvocplayer->set_volume(10);
172 
173     play_done_cb = cb;
174     return 0;
175 }
176