Files
gk-sdk/sample/uvc_app/audio/stream/audio_stream.c
T

128 lines
3.2 KiB
C

/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#include <stdio.h>
#include "uac_hal.h"
#include "audio_stream.h"
#include "sample_audio.h"
#include "uac_log.h"
struct audio_format_map {
audio_stream_format_t hal_format;
audio_bit_depth bit_format;
};
struct audio_format_map format_group[] = {
{AUDIO_STREAM_FORMAT_S8, AUDIO_BIT_DEPTH_8},
{AUDIO_STREAM_FORMAT_S16_LE, AUDIO_BIT_DEPTH_16},
{AUDIO_STREAM_FORMAT_S24_LE, AUDIO_BIT_DEPTH_24},
{AUDIO_STREAM_FORMAT_S32_LE, AUDIO_BIT_DEPTH_32},
};
static int format_hal_to_bit(audio_stream_format_t format)
{
int i;
int nums = sizeof(format_group) / sizeof(struct audio_format_map);
for (i = 0; i < nums; i++) {
if (format_group[i].hal_format == format) {
return format_group[i].bit_format;
}
}
return -1;
}
static int playback_stream_config(unsigned int channels,
unsigned int rate,
unsigned int period_time,
audio_stream_format_t format,
bool is_interleaved)
{
audio_bit_depth bit_format = format_hal_to_bit(format);
uac_logd("channels: %u\n", channels);
uac_logd("rate: %u\n", rate);
uac_logd("period_time: %ums\n", period_time);
uac_logd("format: %d\n", bit_format);
uac_logd("interleaved: %d\n", is_interleaved);
return sample_audio_ai_config(channels, rate, period_time, bit_format, is_interleaved);
}
static int playback_stream_startup(void)
{
return sample_audio_ai_startup();
}
static int playback_stream_shutdown(void)
{
return sample_audio_ai_shutdown();
}
/* Get stream from AI */
static int playback_recv_from_stream(char* buf, int size, int timeout_ms)
{
return sample_audio_get_frame_from_ai(buf, size, timeout_ms);
}
static int capture_stream_config(unsigned int channels,
unsigned int rate,
unsigned int period_time,
audio_stream_format_t format,
bool is_interleaved)
{
audio_bit_depth bit_format = format_hal_to_bit(format);
uac_logd("channels: %u\n", channels);
uac_logd("rate: %u\n", rate);
uac_logd("period_time: %ums\n", period_time);
uac_logd("format: %d\n", bit_format);
uac_logd("interleaved: %d\n", is_interleaved);
return sample_audio_ao_config(channels, rate, period_time, bit_format, is_interleaved);
}
static int capture_stream_startup(void)
{
return sample_audio_ao_startup();
}
static int capture_stream_shutdown(void)
{
return sample_audio_ao_shutdown();
}
/* Send stream to AO */
static int capture_send_to_stream(char* buf, int size, int timeout_ms)
{
return sample_audio_send_frame_to_ao(buf, size, timeout_ms);
}
static audio_stream_dev_t playback_stream_dev = {
.config = playback_stream_config,
.startup = playback_stream_startup,
.shutdown = playback_stream_shutdown,
.recv_from_stream = playback_recv_from_stream,
};
static audio_stream_dev_t capture_stream_dev = {
.config = capture_stream_config,
.startup = capture_stream_startup,
.shutdown = capture_stream_shutdown,
.send_to_stream = capture_send_to_stream,
};
static audio_stream_operate_t strem_operate = {
.playback_stream = &playback_stream_dev,
.capture_stream = &capture_stream_dev,
};
audio_stream_operate_t* get_audio_stream(void)
{
return &strem_operate;
}