fusion/hal/hal_audio/hal_interface_audio.c

88 lines
1.9 KiB
C
Executable File

#include <stdlib.h>
#include "hal_interface_audio.h"
#include "list.h"
#include "htime.h"
#include "hthread.h"
#include "hbase.h"
#include "hlog.h"
#include "hmutex.h"
typedef struct{
struct list_head link;
HAL_AUDIO_FORMAT format;
hal_audio_frame_callback cb;
}audio_ins;
static struct list_head s_alist = LIST_HEAD_INIT(s_alist);
uint32_t hal_audio_openstream(hal_audio_frame_callback cb, HAL_AUDIO_FORMAT format){
struct list_head *pos, *n;
list_for_each_safe(pos, n, &s_alist){
audio_ins* audio = list_entry(pos, audio_ins, link);
if (audio->cb == cb) {
return 0;
}
}
audio_ins *audio = (audio_ins*)hv_malloc(sizeof(audio_ins));
if (!audio){
hloge("%s failed to hv_malloc", __func__);
return -1;
}
audio->cb = cb;
audio->format = format;
list_add_tail(&audio->link, &s_alist);
return 0;
}
uint32_t hal_audio_closestream(hal_audio_frame_callback cb){
struct list_head *pos, *n;
list_for_each_safe(pos, n, &s_alist){
audio_ins* audio = list_entry(pos, audio_ins, link);
if (audio->cb == cb) {
list_del(pos);
hv_free(audio);
return 0;
}
}
return -1;
}
static void * audio_polling_task(void *arg)
{
uint32_t ret;
typedef struct{
int8_t *data;
int16_t size;
}aac_st;
while(1){
audio_frame frame;
ret = hal_audio_get_frame(&frame);
if (ret == 0){
aac_st aac = {0};
struct list_head *pos, *n;
list_for_each_safe(pos, n, &s_alist){
audio_ins* audio = list_entry(pos, audio_ins, link);
frame.format = audio->format;
switch(audio->format){
case HAL_AUDIO_PCM:
audio->cb(&frame);
break;
case HAL_AUDIO_AAC_LC:{
if (aac.data == NULL){
//encode aac ......
}
if (aac.data && aac.size){
memcpy(frame.data, aac.data, aac.size);
frame.size = aac.size;
audio->cb(&frame);
}
}break;
default:
break;
}
}
}
}
}