doubao_chat/lib/net/libduer-device/examples/dcs3.0-demo/duerapp_media.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;
}
}