[Audio_test]修复Ql_AudPlayer_PlayFrmFile播放完成回调方法不生效的问题
1.修复Ql_AudPlayer_PlayFrmFile播放完成回调方法不生效的问题
2.修复write操作后返回值为-1报错的问题
Change-Id: I2b9695653301e4bbe6f805a359c47c0ce77d1a9c
diff --git a/mbtk/mbtk_lib/src/mbtk_audio_alsa.c b/mbtk/mbtk_lib/src/mbtk_audio_alsa.c
index 90015b4..83d2585 100755
--- a/mbtk/mbtk_lib/src/mbtk_audio_alsa.c
+++ b/mbtk/mbtk_lib/src/mbtk_audio_alsa.c
@@ -48,7 +48,15 @@
#define ID_DATA 0x61746164
#define FORMAT_PCM 1
-
+typedef enum {
+ AUD_PLAYER_ERROR = -1,
+ AUD_PLAYER_START = 0,
+ AUD_PLAYER_PAUSE,
+ AUD_PLAYER_RESUME,
+ AUD_PLAYER_NODATA, //Buff no data and play tread will sleep
+ AUD_PLAYER_LESSDATA, //Buff has less data
+ AUD_PLAYER_FINISHED,
+} Enum_AudPlayer_State;
struct mopen_audio_t
{
@@ -71,6 +79,12 @@
void *cb_data;
};
+struct player_cb_s
+{
+ mbtk_audio_player_cb_func _cb;
+ void *cb_data;
+};
+
static struct mopen_audio_t *internal_hdl = NULL;
@@ -611,7 +625,7 @@
}
-int mbtk_audio_play_file(void *dev_hdl, int file_fd, int offset)
+int mbtk_audio_play_file(void *dev_hdl, int file_fd, int offset, mbtk_audio_player_cb_func cb_func)
{
unsigned bufsize = 0;
char *data = NULL;
@@ -621,15 +635,17 @@
int ret;
struct mopen_audio_t *pcxt = (struct mopen_audio_t *)dev_hdl;
-
+ struct player_cb_s *_usrData = NULL;
if (NULL == dev_hdl || NULL == internal_hdl)
return -1;
if(AUDIO_RUNNING == pcxt->state)
return -2;
- file_data_sz = mbtk_wav_pcm16Le_check(file_fd);
-
+ // file_data_sz = mbtk_wav_pcm16Le_check(file_fd);
+ _usrData = malloc(sizeof(struct player_cb_s));
+ _usrData->_cb = cb_func;
+ _usrData->cb_data = NULL;
bufsize = pcxt->pcm_packet_size;
data = calloc(1, bufsize);
if (!data) {
@@ -663,23 +679,28 @@
while(AUDIO_PAUSE == pcxt->state)
{
usleep(80000);
+ _usrData->_cb((int)pcxt, AUD_PLAYER_PAUSE);
}
if ((0 == first_set || AUDIO_RESUME == pcxt->state))
{
first_set = 1;
mbtk_audio_set_status(dev_hdl, AUDIO_RUNNING);
+ _usrData->_cb((int)pcxt, AUD_PLAYER_RESUME);
}
- ret = pcxt->stream_out->write(pcxt->stream_out, data, res);
+ ret = pcxt->stream_out->write(pcxt->stream_out, data, bufsize);
if (ret < 0) {
printf("%s: error writing (child).\n", __FUNCTION__);
+ _usrData->_cb((int)pcxt, AUD_PLAYER_ERROR);
break;
} else if (ret < (signed int)pcxt->pcm_packet_size) {
printf("%s: wrote less than buffer size, rc=%d.\n", __FUNCTION__, ret);
+ _usrData->_cb((int)pcxt, AUD_PLAYER_LESSDATA);
break;
}
}
+ _usrData->_cb((int)pcxt, AUD_PLAYER_FINISHED);
printf("file_data_sz :%d - all_size: %d\n", file_data_sz, all_size);
mbtk_audio_set_status(dev_hdl, AUDIO_OPEN);