248 lines
5.4 KiB
C
248 lines
5.4 KiB
C
/**
|
|
* Copyright (2017) Baidu Inc. All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
/**
|
|
* File: duerapp_media.c
|
|
* Auth: Renhe Zhang (v_zhangrenhe@baidu.com)
|
|
* Desc: Media module function implementation.
|
|
*/
|
|
|
|
|
|
#include "duerapp_media.h"
|
|
#include "duerapp_config.h"
|
|
#include "lightduer_dcs.h"
|
|
#include "server/audio_server.h"
|
|
|
|
#define VOLUME_MAX (100)
|
|
#define VOLUME_MIX (0)
|
|
#define VOLUME_INIT (30)
|
|
|
|
static volatile duer_speak_state_t s_speak_state;
|
|
static volatile duer_audio_state_t s_audio_state;
|
|
static volatile duer_alarm_state_t s_alarm_state;
|
|
static char *s_url;
|
|
static int s_seek = -1;
|
|
static int s_vol;
|
|
static bool s_mute;
|
|
|
|
extern void JL_duer_media_audio_continue(const char *url);
|
|
extern void JL_duer_media_speak_play(const char *url);
|
|
extern void JL_duer_media_audio_play(const char *url);
|
|
extern void JL_duer_volume_change_notify(int volume);
|
|
|
|
__attribute__((weak)) int get_app_music_volume(void)
|
|
{
|
|
return 100;
|
|
}
|
|
|
|
__attribute__((weak)) int get_app_music_playtime(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void duer_media_init()
|
|
{
|
|
s_speak_state = MEDIA_SPEAK_STOP;
|
|
s_audio_state = MEDIA_AUDIO_STOP;
|
|
s_alarm_state = MEDIA_ALARM_STOP;
|
|
s_url = NULL;
|
|
s_seek = 0;
|
|
s_vol = get_app_music_volume();
|
|
s_mute = FALSE;
|
|
}
|
|
|
|
void duer_media_speak_play(const char *url)
|
|
{
|
|
s_speak_state = MEDIA_SPEAK_PLAY;
|
|
JL_duer_media_speak_play(url);
|
|
}
|
|
|
|
void duer_media_speak_stop()
|
|
{
|
|
s_speak_state = MEDIA_SPEAK_STOP;
|
|
}
|
|
|
|
/*该函数不能被阻塞*/
|
|
void duer_media_audio_start(const char *url)
|
|
{
|
|
DUER_LOGI("duer_media_audio_start, Audio play state : %d", s_audio_state);
|
|
|
|
if (s_url) {
|
|
free(s_url);
|
|
s_url = NULL;
|
|
}
|
|
|
|
s_url = (char *)malloc(strlen(url) + 1);
|
|
if (s_url) {
|
|
strcpy(s_url, url);
|
|
} else {
|
|
DUER_LOGE("malloc url failed!");
|
|
}
|
|
s_seek = 0;
|
|
JL_duer_media_audio_play(url);
|
|
s_audio_state = MEDIA_AUDIO_PLAY;
|
|
}
|
|
|
|
void duer_media_audio_resume(const char *url, int offset)
|
|
{
|
|
DUER_LOGI("duer_media_audio_resume, Audio seek state : %d", s_audio_state);
|
|
|
|
if (MEDIA_AUDIO_PAUSE == s_audio_state) {
|
|
JL_duer_media_audio_continue(NULL);
|
|
s_audio_state = MEDIA_AUDIO_PLAY;
|
|
} else if (MEDIA_AUDIO_STOP == s_audio_state) {
|
|
duer_media_audio_start(url);
|
|
}
|
|
}
|
|
|
|
/*该函数不能被阻塞*/
|
|
void duer_media_audio_stop()
|
|
{
|
|
s_audio_state = MEDIA_AUDIO_STOP;
|
|
DUER_LOGI("Audio state : stop ");
|
|
}
|
|
|
|
/*该函数不能被阻塞*/
|
|
void duer_media_audio_pause()
|
|
{
|
|
if (MEDIA_AUDIO_PLAY == s_audio_state) {
|
|
s_audio_state = MEDIA_AUDIO_PAUSE;
|
|
DUER_LOGI("Audio state : pause ");
|
|
}
|
|
}
|
|
|
|
/*该函数不能被阻塞*/
|
|
int duer_media_audio_get_position()
|
|
{
|
|
s_seek = get_app_music_playtime() * 1000;
|
|
|
|
if (!s_seek) {
|
|
s_seek = 500;
|
|
}
|
|
|
|
return s_seek;
|
|
}
|
|
|
|
duer_audio_state_t duer_media_audio_state()
|
|
{
|
|
return s_audio_state;
|
|
}
|
|
|
|
void duer_media_set_audio_state(duer_audio_state_t state)
|
|
{
|
|
s_audio_state = state;
|
|
}
|
|
|
|
void duer_media_set_volume_notify(int volume)
|
|
{
|
|
s_vol = volume;
|
|
if (s_vol == 0) {
|
|
s_mute = true;
|
|
} else {
|
|
s_mute = false;
|
|
}
|
|
DUER_LOGD("volume : %d", s_vol);
|
|
if (DUER_OK == duer_dcs_on_volume_changed()) {
|
|
DUER_LOGD("volume change OK");
|
|
}
|
|
}
|
|
|
|
/*把音量调到相对值范围-100~100,不能堵塞*/
|
|
void duer_media_volume_change(int volume)
|
|
{
|
|
s_vol += volume;
|
|
if (s_vol < VOLUME_MIX) {
|
|
s_vol = 0;
|
|
} else if (s_vol > VOLUME_MAX) {
|
|
s_vol = VOLUME_MAX;
|
|
}
|
|
|
|
if (s_vol == 0) {
|
|
s_mute = true;
|
|
} else {
|
|
s_mute = false;
|
|
}
|
|
|
|
JL_duer_volume_change_notify(s_vol);
|
|
|
|
DUER_LOGI("volume : %d", s_vol);
|
|
if (DUER_OK == duer_dcs_on_volume_changed()) {
|
|
DUER_LOGI("volume change OK");
|
|
}
|
|
}
|
|
|
|
/*把音量调到绝对值范围0~100,不能堵塞*/
|
|
void duer_media_set_volume(int volume)
|
|
{
|
|
if (volume == 1) {
|
|
volume = 0;
|
|
}
|
|
s_vol = volume;
|
|
if (s_vol == 0) {
|
|
s_mute = true;
|
|
} else {
|
|
s_mute = false;
|
|
}
|
|
DUER_LOGD("volume : %d", s_vol);
|
|
JL_duer_volume_change_notify(s_vol);
|
|
if (DUER_OK == duer_dcs_on_volume_changed()) {
|
|
DUER_LOGD("volume change OK");
|
|
}
|
|
}
|
|
|
|
/*获取设备音量值,不能堵塞*/
|
|
int duer_media_get_volume()
|
|
{
|
|
return s_vol;
|
|
}
|
|
|
|
/*设置和取消静音,不能堵塞*/
|
|
void duer_media_set_mute(bool mute)
|
|
{
|
|
if (s_mute == mute) {
|
|
return;
|
|
}
|
|
s_mute = mute;
|
|
|
|
if (mute) {
|
|
JL_duer_volume_change_notify(0);
|
|
} else {
|
|
JL_duer_volume_change_notify(60);
|
|
}
|
|
|
|
duer_dcs_on_mute();
|
|
}
|
|
|
|
/*获取设备是否静音,不能堵塞*/
|
|
bool duer_media_get_mute()
|
|
{
|
|
return s_mute;
|
|
}
|
|
|
|
void duer_media_alarm_play(const char *url)
|
|
{
|
|
if (MEDIA_ALARM_STOP == s_alarm_state) {
|
|
s_alarm_state = MEDIA_ALARM_PLAY;
|
|
JL_duer_media_audio_play(url);
|
|
}
|
|
}
|
|
|
|
void duer_media_alarm_stop()
|
|
{
|
|
if (MEDIA_ALARM_PLAY == s_alarm_state) {
|
|
s_alarm_state = MEDIA_ALARM_STOP;
|
|
}
|
|
}
|