104 lines
4.2 KiB
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);
|
|
} |