1 /*
2  * Copyright (c) 2022, sakumisu
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef USBH_AUDIO_H
7 #define USBH_AUDIO_H
8 
9 #include "usb_audio.h"
10 
11 #ifndef CONFIG_USBHOST_AUDIO_MAX_STREAMS
12 #define CONFIG_USBHOST_AUDIO_MAX_STREAMS 3
13 #endif
14 
15 struct usbh_audio_ac_msg {
16     struct audio_cs_if_ac_input_terminal_descriptor ac_input;
17     struct audio_cs_if_ac_feature_unit_descriptor ac_feature_unit;
18     struct audio_cs_if_ac_output_terminal_descriptor ac_output;
19 };
20 
21 struct usbh_audio_as_msg {
22     const char *stream_name;
23     uint8_t stream_intf;
24     uint8_t input_terminal_id;
25     uint8_t feature_terminal_id;
26     uint8_t output_terminal_id;
27     uint8_t ep_attr;
28     uint8_t num_of_altsetting;
29     uint16_t volume_min;
30     uint16_t volume_max;
31     uint16_t volume_res;
32     uint16_t volume_cur;
33     bool mute;
34     struct audio_cs_if_as_general_descriptor as_general;
35     struct audio_cs_if_as_format_type_descriptor as_format[CONFIG_USBHOST_MAX_INTF_ALTSETTINGS];
36 };
37 
38 struct usbh_audio {
39     struct usbh_hubport *hport;
40     struct usb_endpoint_descriptor *isoin;  /* ISO IN endpoint */
41     struct usb_endpoint_descriptor *isoout; /* ISO OUT endpoint */
42 
43     uint8_t ctrl_intf; /* interface number */
44     uint8_t minor;
45     uint16_t isoin_mps;
46     uint16_t isoout_mps;
47     bool is_opened;
48     uint16_t bcdADC;
49     uint8_t bInCollection;
50     uint8_t stream_intf_num;
51     struct usbh_audio_as_msg as_msg_table[CONFIG_USBHOST_AUDIO_MAX_STREAMS];
52 
53     void *user_data;
54 };
55 
56 #ifdef __cplusplus
57 extern "C" {
58 #endif
59 
60 int usbh_audio_open(struct usbh_audio *audio_class, const char *name, uint32_t samp_freq, uint8_t bitresolution);
61 int usbh_audio_close(struct usbh_audio *audio_class, const char *name);
62 int usbh_audio_set_volume(struct usbh_audio *audio_class, const char *name, uint8_t ch, int volume_db);
63 int usbh_audio_set_mute(struct usbh_audio *audio_class, const char *name, uint8_t ch, bool mute);
64 
65 void usbh_audio_run(struct usbh_audio *audio_class);
66 void usbh_audio_stop(struct usbh_audio *audio_class);
67 
68 #ifdef __cplusplus
69 }
70 #endif
71 
72 #endif /* USBH_AUDIO_H */
73