STM32H750VB_DAC_AzureRTOS/Core/Src/usbd_uac_process.c

104 lines
4.2 KiB
C

#include "stm32h7xx_hal.h"
#include "audio/audio_amp.h"
#include "audio/audio_clocksel.h"
#include "usbd_uac_process.h"
UX_DEVICE_CLASS_AUDIO_PARAMETER audio_param;
UX_DEVICE_CLASS_AUDIO_STREAM_PARAMETER audio_stream_param[1];
UX_DEVICE_CLASS_AUDIO20_CONTROL audio_control[1];
UCHAR audio_buffer[256];
extern SAI_HandleTypeDef hsai_BlockA3;
static UINT usbd_uac_request_process(UX_DEVICE_CLASS_AUDIO *audio, UX_SLAVE_TRANSFER *transfer);
static VOID usbd_uac_activate(VOID *args);
static VOID usbd_uac_deactivate(VOID *args);
static VOID usbd_uac_stream_change(UX_DEVICE_CLASS_AUDIO_STREAM *stream, ULONG alternate_setting);
static VOID usbd_uac_frame_done(UX_DEVICE_CLASS_AUDIO_STREAM *stream, ULONG actual_len);
UINT usbd_uac_class_register(void) {
audio_control[0].ux_device_class_audio20_control_cs_id = 0x10;
audio_control[0].ux_device_class_audio20_control_sampling_frequency = 48000;
audio_control[0].ux_device_class_audio20_control_fu_id = 0x30;
audio_control[0].ux_device_class_audio20_control_mute[0] = 0;
audio_control[0].ux_device_class_audio20_control_volume_min[0] = -64;
audio_control[0].ux_device_class_audio20_control_volume_max[0] = 0;
audio_control[0].ux_device_class_audio20_control_volume_res[0] = 1;
audio_control[0].ux_device_class_audio20_control_volume[0] = -64;
audio_stream_param[0].ux_device_class_audio_stream_parameter_callbacks.ux_device_class_audio_stream_change =
usbd_uac_stream_change;
audio_stream_param[0].ux_device_class_audio_stream_parameter_callbacks.ux_device_class_audio_stream_frame_done =
usbd_uac_frame_done;
audio_stream_param[0].ux_device_class_audio_stream_parameter_max_frame_buffer_nb = 2;
audio_stream_param[0].ux_device_class_audio_stream_parameter_max_frame_buffer_size = 256;
audio_stream_param[0].ux_device_class_audio_stream_parameter_thread_entry = ux_device_class_audio_read_thread_entry;
audio_param.ux_device_class_audio_parameter_streams_nb = 1;
audio_param.ux_device_class_audio_parameter_streams = audio_stream_param;
audio_param.ux_device_class_audio_parameter_callbacks.ux_slave_class_audio_instance_activate = usbd_uac_activate;
audio_param.ux_device_class_audio_parameter_callbacks.ux_slave_class_audio_instance_deactivate =
usbd_uac_deactivate;
audio_param.ux_device_class_audio_parameter_callbacks.ux_device_class_audio_control_process =
usbd_uac_request_process;
return ux_device_stack_class_register(_ux_system_slave_class_audio_name, ux_device_class_audio_entry, 1, 0,
&audio_param);
}
UINT usbd_uac_request_process(UX_DEVICE_CLASS_AUDIO *audio, UX_SLAVE_TRANSFER *transfer) {
UINT status;
UX_DEVICE_CLASS_AUDIO20_CONTROL_GROUP group = {1, audio_control};
//
status = ux_device_class_audio20_control_process(audio, transfer, &group);
if (status != UX_SUCCESS) {
return status;
}
switch (audio_control[0].ux_device_class_audio20_control_changed) {
case UX_DEVICE_CLASS_AUDIO20_CONTROL_MUTE_CHANGED:
audio_amp_set_volume(0);
break;
case UX_DEVICE_CLASS_AUDIO20_CONTROL_VOLUME_CHANGED:
audio_amp_set_volume((uint8_t)(audio_control[0].ux_device_class_audio20_control_volume[0] * -1));
break;
default:
break;
}
return UX_SUCCESS;
}
static VOID usbd_uac_activate(VOID *args) {
audio_amp_power(1);
audio_clock_select(AUDIO_CLKIN_24M);
}
static VOID usbd_uac_deactivate(VOID *args) {
//
}
static VOID usbd_uac_stream_change(UX_DEVICE_CLASS_AUDIO_STREAM *stream, ULONG alternate_setting) {
if(alternate_setting == 0) {
memset(audio_buffer, 0x00, sizeof(audio_buffer));
return;
}
ux_device_class_audio_reception_start(stream);
}
static VOID usbd_uac_frame_done(UX_DEVICE_CLASS_AUDIO_STREAM *stream, ULONG actual_len) {
UCHAR *buf;
ULONG len;
ux_device_class_audio_read_frame_get(stream, &buf, &len);
HAL_SAI_Transmit_DMA(&hsai_BlockA3, buf, len);
ux_device_class_audio_read_frame_free(stream);
}