A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id: $
9 *
10 * Copyright (C) 2010 by Amaury Pouly
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20/* NOTE
21 *
22 * This is USBAudio 1.0. USBAudio 2.0 is notably _not backwards compatible!_
23 * USBAudio 1.0 over _USB_ 2.0 is perfectly valid!
24 *
25 * Relevant specifications are USB 2.0 and USB Audio Class 1.0.
26 */
27
28#include "string.h"
29#include "system.h"
30#include "usb_core.h"
31#include "usb_drv.h"
32#include "kernel.h"
33#include "sound.h"
34#include "usb_class_driver.h"
35#include "usb_audio_def.h"
36#include "pcm_sampr.h"
37#include "audio.h"
38#include "sound.h"
39#include "stdlib.h"
40#include "fixedpoint.h"
41#include "misc.h"
42#include "settings.h"
43#include "core_alloc.h"
44#include "pcm_mixer.h"
45#include "dsp_core.h"
46
47#define LOGF_ENABLE
48#include "logf.h"
49
50// is there a "best practices" for converting between floats and fixed point?
51// NOTE: SIGNED
52#define TO_16DOT16_FIXEDPT(val) ((int32_t)(val) * (1<<16))
53#define TO_DOUBLE(val) ((double)(val) / (1<<16))
54
55/* Audio Control Interface */
56static struct usb_interface_descriptor
57 ac_interface =
58{
59 .bLength = sizeof(struct usb_interface_descriptor),
60 .bDescriptorType = USB_DT_INTERFACE,
61 .bInterfaceNumber = 0,
62 .bAlternateSetting = 0,
63 .bNumEndpoints = 0,
64 .bInterfaceClass = USB_CLASS_AUDIO,
65 .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL,
66 .bInterfaceProtocol = 0,
67 .iInterface = 0
68};
69
70/* Audio Control Terminals/Units*/
71static struct usb_ac_header ac_header =
72{
73 .bLength = USB_AC_SIZEOF_HEADER(1), /* one interface */
74 .bDescriptorType = USB_DT_CS_INTERFACE,
75 .bDescriptorSubType = USB_AC_HEADER,
76 .bcdADC = 0x0100, /* Identifies this as usb audio class 1.0 */
77 .wTotalLength = 0, /* fill later */
78 .bInCollection = 1, /* one interface */
79 .baInterfaceNr = {0}, /* fill later */
80};
81
82enum
83{
84 AC_PLAYBACK_INPUT_TERMINAL_ID = 1,
85 AC_PLAYBACK_FEATURE_ID,
86 AC_PLAYBACK_OUTPUT_TERMINAL_ID,
87};
88
89static struct usb_ac_input_terminal ac_playback_input =
90{
91 .bLength = sizeof(struct usb_ac_input_terminal),
92 .bDescriptorType = USB_DT_CS_INTERFACE,
93 .bDescriptorSubType = USB_AC_INPUT_TERMINAL,
94 .bTerminalId = AC_PLAYBACK_INPUT_TERMINAL_ID,
95 .wTerminalType = USB_AC_TERMINAL_STREAMING,
96 .bAssocTerminal = 0,
97 .bNrChannels = 2,
98 .wChannelConfig = USB_AC_CHANNELS_LEFT_RIGHT_FRONT,
99 .iChannelNames = 0,
100 .iTerminal = 0,
101};
102
103static struct usb_ac_output_terminal ac_playback_output =
104{
105 .bLength = sizeof(struct usb_ac_output_terminal),
106 .bDescriptorType = USB_DT_CS_INTERFACE,
107 .bDescriptorSubType = USB_AC_OUTPUT_TERMINAL,
108 .bTerminalId = AC_PLAYBACK_OUTPUT_TERMINAL_ID,
109 .wTerminalType = USB_AC_OUTPUT_TERMINAL_HEADPHONES,
110 .bAssocTerminal = 0,
111 .bSourceId = AC_PLAYBACK_FEATURE_ID,
112 .iTerminal = 0,
113};
114
115/* Feature Unit with 2 logical channels and 1 byte(8 bits) per control */
116DEFINE_USB_AC_FEATURE_UNIT(8, 2)
117
118static struct usb_ac_feature_unit_8_2 ac_playback_feature =
119{
120 .bLength = sizeof(struct usb_ac_feature_unit_8_2),
121 .bDescriptorType = USB_DT_CS_INTERFACE,
122 .bDescriptorSubType = USB_AC_FEATURE_UNIT,
123 .bUnitId = AC_PLAYBACK_FEATURE_ID,
124 .bSourceId = AC_PLAYBACK_INPUT_TERMINAL_ID,
125 .bControlSize = 1, /* by definition */
126 .bmaControls = {
127 [0] = USB_AC_FU_MUTE | USB_AC_FU_VOLUME,
128 [1] = 0,
129 [2] = 0
130 },
131 .iFeature = 0
132};
133
134/* Audio Streaming Interface */
135/* Alternative: no streaming */
136static struct usb_interface_descriptor
137 as_interface_alt_idle_playback =
138{
139 .bLength = sizeof(struct usb_interface_descriptor),
140 .bDescriptorType = USB_DT_INTERFACE,
141 .bInterfaceNumber = 0,
142 .bAlternateSetting = 0,
143 .bNumEndpoints = 0,
144 .bInterfaceClass = USB_CLASS_AUDIO,
145 .bInterfaceSubClass = USB_SUBCLASS_AUDIO_STREAMING,
146 .bInterfaceProtocol = 0,
147 .iInterface = 0
148};
149
150/* Alternative: output streaming */
151static struct usb_interface_descriptor
152 as_interface_alt_playback =
153{
154 .bLength = sizeof(struct usb_interface_descriptor),
155 .bDescriptorType = USB_DT_INTERFACE,
156 .bInterfaceNumber = 0,
157 .bAlternateSetting = 1,
158 .bNumEndpoints = 2, // iso audio, iso feedback
159 .bInterfaceClass = USB_CLASS_AUDIO,
160 .bInterfaceSubClass = USB_SUBCLASS_AUDIO_STREAMING,
161 .bInterfaceProtocol = 0,
162 .iInterface = 0
163};
164
165/* Class Specific Audio Streaming Interface */
166static struct usb_as_interface
167 as_playback_cs_interface =
168{
169 .bLength = sizeof(struct usb_as_interface),
170 .bDescriptorType = USB_DT_CS_INTERFACE,
171 .bDescriptorSubType = USB_AS_GENERAL,
172 .bTerminalLink = AC_PLAYBACK_INPUT_TERMINAL_ID,
173 .bDelay = 1,
174 .wFormatTag = USB_AS_FORMAT_TYPE_I_PCM
175};
176
177static struct usb_as_format_type_i_discrete
178 as_playback_format_type_i =
179{
180 .bLength = USB_AS_SIZEOF_FORMAT_TYPE_I_DISCRETE((HW_FREQ_44+1)),
181 .bDescriptorType = USB_DT_CS_INTERFACE,
182 .bDescriptorSubType = USB_AS_FORMAT_TYPE,
183 .bFormatType = USB_AS_FORMAT_TYPE_I,
184 .bNrChannels = 2, /* Stereo */
185 .bSubframeSize = 2, /* 2 bytes per sample */
186 .bBitResolution = 16, /* all 16-bits are used */
187 .bSamFreqType = (HW_FREQ_44+1),
188 .tSamFreq = {
189 // only values 44.1k and higher (array is in descending order)
190 [0 ... HW_FREQ_44 ] = {0}, /* filled later */
191 }
192};
193
194static struct usb_as_iso_audio_endpoint
195 as_iso_audio_out_ep =
196{
197 .bLength = sizeof(struct usb_as_iso_audio_endpoint),
198 .bDescriptorType = USB_DT_ENDPOINT,
199 .bEndpointAddress = USB_DIR_OUT, /* filled later */
200 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC | USB_ENDPOINT_USAGE_DATA,
201 .wMaxPacketSize = 0, /* filled later */
202 .bInterval = 0, /* filled later - 1 for full speed, 4 for high-speed */
203 .bRefresh = 0,
204 .bSynchAddress = 0 /* filled later to the address of as_iso_synch_in_ep */
205};
206
207/*
208 * Updaing the desired sample frequency:
209 *
210 * The iso OUT ep is inextricably linked to the feedback iso IN ep
211 * when using Asynchronous mode. It periodically describes to the host
212 * how fast to send the data.
213 *
214 * Some notes from the usbaudio 1.0 documentation:
215 * - bSyncAddress of the iso OUT ep must be set to the address of the iso IN feedback ep
216 * - bSyncAddress of the iso IN feedback ep must be zero
217 * - F_f (desired sampling frequency) describes directly the number of samples the endpoint
218 * wants to receive per frame to match the actual sampling frequency F_s
219 * - There is a value, (2^(10-P)), which is how often (in 1mS frames) the F_f value will be sent
220 * - P appears to be somewhat arbitrary, though the spec wants it to relate the real sample rate
221 * F_s to the master clock rate F_m by the relationship (F_m = F_s * (2^(P-1)))
222 * - The above description of P is somewhat moot because of how much buffering we have. I suspect it
223 * was written for devices with essentially zero buffering.
224 * - bRefresh of the feedback endpoint descriptor should be set to (10-P). This can range from 1 to 9.
225 * A value of 1 would mean refreshing every 2^1 mS = 2 mS, a value of 9 would mean refreshing every
226 * 2^9 mS = 512 mS.
227 * - The F_f value should be encoded in "10.10" format, but justified to the leftmost 24 bits,
228 * so it ends up looking like "10.14" format. This format is 3 bytes long. On USB 2.0, it seems that
229 * the USB spec overrides the UAC 1.0 spec here, so high-speed bus operation needs "16.16" format,
230 * in a 4 byte packet.
231 */
232#define FEEDBACK_UPDATE_RATE_P 5
233#define FEEDBACK_UPDATE_RATE_REFRESH (10-FEEDBACK_UPDATE_RATE_P)
234#define FEEDBACK_UPDATE_RATE_FRAMES (0x1<<FEEDBACK_UPDATE_RATE_REFRESH)
235static struct usb_as_iso_synch_endpoint
236 as_iso_synch_in_ep =
237{
238 .bLength = sizeof(struct usb_as_iso_synch_endpoint),
239 .bDescriptorType = USB_DT_ENDPOINT,
240 .bEndpointAddress = USB_DIR_IN, /* filled later */
241 .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_NONE | USB_ENDPOINT_USAGE_FEEDBACK,
242 .wMaxPacketSize = 4,
243 .bInterval = 0, /* filled later - 1 or 4 depending on bus speed */
244 .bRefresh = FEEDBACK_UPDATE_RATE_REFRESH, /* This describes how often this ep will update F_f (see above) */
245 .bSynchAddress = 0 /* MUST be zero! */
246};
247
248static struct usb_as_iso_ctrldata_endpoint
249 as_iso_ctrldata_samfreq =
250{
251 .bLength = sizeof(struct usb_as_iso_ctrldata_endpoint),
252 .bDescriptorType = USB_DT_CS_ENDPOINT,
253 .bDescriptorSubType = USB_AS_EP_GENERAL,
254 .bmAttributes = USB_AS_EP_CS_SAMPLING_FREQ_CTL,
255 .bLockDelayUnits = 0, /* undefined */
256 .wLockDelay = 0 /* undefined */
257};
258
259static const struct usb_descriptor_header* const ac_cs_descriptors_list[] =
260{
261 (struct usb_descriptor_header *) &ac_header,
262 (struct usb_descriptor_header *) &ac_playback_input,
263 (struct usb_descriptor_header *) &ac_playback_feature,
264 (struct usb_descriptor_header *) &ac_playback_output,
265};
266
267#define AC_CS_DESCRIPTORS_LIST_SIZE (sizeof(ac_cs_descriptors_list)/sizeof(ac_cs_descriptors_list[0]))
268
269// TODO: AudioControl Interrupt endpoint to inform the host that changes were made on-device!
270// The most immediately useful of this capability is volume and mute changes.
271static const struct usb_descriptor_header* const usb_descriptors_list[] =
272{
273 /* Audio Control */
274 (struct usb_descriptor_header *) &ac_interface,
275 (struct usb_descriptor_header *) &ac_header,
276 (struct usb_descriptor_header *) &ac_playback_input,
277 (struct usb_descriptor_header *) &ac_playback_feature,
278 (struct usb_descriptor_header *) &ac_playback_output,
279 /* Audio Streaming */
280 /* Idle Playback */
281 (struct usb_descriptor_header *) &as_interface_alt_idle_playback,
282 /* Playback */
283 (struct usb_descriptor_header *) &as_interface_alt_playback,
284 (struct usb_descriptor_header *) &as_playback_cs_interface,
285 (struct usb_descriptor_header *) &as_playback_format_type_i,
286 /* NOTE: the order of these three is important for maximum compatibility.
287 * Synch ep should follow iso out ep, with ctrldata descriptor coming first. */
288 (struct usb_descriptor_header *) &as_iso_ctrldata_samfreq,
289 (struct usb_descriptor_header *) &as_iso_audio_out_ep,
290 (struct usb_descriptor_header *) &as_iso_synch_in_ep,
291};
292
293#define USB_DESCRIPTORS_LIST_SIZE (sizeof(usb_descriptors_list)/sizeof(usb_descriptors_list[0]))
294
295static int usb_interface; /* first interface */
296static int usb_as_playback_intf_alt; /* playback streaming interface alternate setting */
297
298static int as_playback_freq_idx; /* audio playback streaming frequency index (in hw_freq_sampr) */
299
300static int out_iso_ep_adr; /* output isochronous endpoint */
301static int in_iso_feedback_ep_adr; /* input feedback isochronous endpoint */
302
303/* small buffer used for control transfers */
304static unsigned char usb_buffer[128] USB_DEVBSS_ATTR;
305
306/* number of buffers: 2 is double-buffering (one for usb, one for playback),
307 * 3 is triple-buffering (one for usb, one for playback, one for queuing), ... */
308
309/* Samples come in (maximum) 1023 byte chunks. Samples are also 16 bits per channel per sample.
310 *
311 * One buffer holds (1023 / (2Bx2ch)) = 255 (rounded down) samples
312 * So the _maximum_ play time per buffer is (255 / sps).
313 * For 44100 Hz: 5.7 mS
314 * For 48000 Hz: 5.3 mS
315 * For 192000 Hz: 1.3 mS
316 *
317 * From testing on MacOS (likely to be the toughest customer...) on Designware driver
318 * we get data every Frame (so, every millisecond).
319 *
320 * If we get data every millisecond, we need 1mS to transfer 1.3mS of playback
321 * in order to sustain 192 kHz playback!
322 * At 44.1 kHz, the requirements are much less - 1mS of data transfer for 5.7mS of playback
323 * At 48 kHz, 1mS can transfer 5.3mS of playback.
324 *
325 * It appears that this is "maximum", but we more likely get "enough for 1mS" every millisecond.
326 *
327 * Working backwards:
328 * 44100 Hz: 45 samples transferred every frame (*2ch * 2bytes) = 180 bytes every frame
329 * 48000 Hz: 48 samples transferred every frame (*2ch * 2bytes) = 192 bytes every frame
330 * 192000 Hz: *2ch *2bytes = 768 bytes every frame
331 *
332 * We appear to be more limited by our PCM system's need to gobble up data at startup.
333 * This may actually, contrary to intuition, make us need a higher number of buffers
334 * for _lower_ sample rates, as we will need more buffers' worth of data up-front due to
335 * lower amounts of data in each USB frame (assuming the mixer wants the same amount of data upfront
336 * regardless of sample rate).
337 *
338 * Making the executive decision to only export frequencies 44.1k+.
339 */
340#define NR_BUFFERS 32
341#define MINIMUM_BUFFERS_QUEUED 16
342/* size of each buffer: must be smaller than 1023 (max isochronous packet size) */
343#define BUFFER_SIZE 1023
344/* make sure each buffer size is actually a multiple of 32 bytes to avoid any
345 * issue with strange alignements */
346#define REAL_BUF_SIZE ALIGN_UP(BUFFER_SIZE, 32)
347
348bool alloc_failed = false;
349bool usb_audio_playing = false;
350int tmp_saved_vol;
351
352/* buffers used for usb, queuing and playback */
353static unsigned char *rx_buffer;
354int rx_buffer_handle;
355/* buffer size */
356static int rx_buf_size[NR_BUFFERS]; // only used for debug screen counter now
357/* index of the next buffer to play */
358static int rx_play_idx;
359/* index of the next buffer to fill */
360static int rx_usb_idx;
361/* playback underflowed ? */
362bool playback_audio_underflow;
363/* usb overflow ? */
364bool usb_rx_overflow;
365
366/* dsp processing buffers */
367#define DSP_BUF_SIZE (BUFFER_SIZE*4) // arbitrarily x4
368#define REAL_DSP_BUF_SIZE ALIGN_UP(DSP_BUF_SIZE, 32)
369static uint16_t *dsp_buf;
370int dsp_buf_handle;
371static int dsp_buf_size[NR_BUFFERS];
372struct dsp_config *dsp = NULL;
373
374/* feedback variables */
375#define USB_FRAME_MAX 0x7FF
376#define NR_SAMPLES_HISTORY 32
377int32_t samples_fb;
378int32_t buffers_filled_old;
379long buffers_filled_accumulator;
380long buffers_filled_accumulator_old;
381int buffers_filled_avgcount;
382int buffers_filled_avgcount_old;
383static uint8_t sendFf[4] USB_DEVBSS_ATTR;
384static bool sent_fb_this_frame = false;
385int fb_startframe = 0;
386bool send_fb = false;
387
388/* debug screen sample count display variables */
389static unsigned long samples_received;
390static unsigned long samples_received_last;
391int32_t samples_received_report;
392int buffers_filled_min;
393int buffers_filled_min_last;
394int buffers_filled_max;
395int buffers_filled_max_last;
396
397/* frame drop recording variables */
398static int last_frame = 0;
399static int frames_dropped = 0;
400
401/* for blocking normal playback */
402static bool usbaudio_active = false;
403
404/* Schematic view of the RX situation:
405 * (in case NR_BUFFERS = 4)
406 *
407 * +--------+ +--------+ +--------+ +--------+
408 * | | | | | | | |
409 * | buf[0] | ---> | buf[1] | ---> | buf[2] | ---> | buf[3] | ---> (back to buf[0])
410 * | | | | | | | |
411 * +--------+ +--------+ +--------+ +--------+
412 * ^ ^ ^ ^
413 * | | | |
414 * rx_play_idx (buffer rx_usb_idx (empty buffer)
415 * (buffer being filled) (buffer being
416 * played) filled)
417 *
418 * Error handling:
419 * in the RX situation, there are two possible errors
420 * - playback underflow: playback wants more data but we don't have any to
421 * provide, so we have to stop audio and wait for some prebuffering before
422 * starting again
423 * - usb overflow: usb wants to send more data but don't have any more free buffers,
424 * so we have to pause usb reception and wait for some playback buffer to become
425 * free again
426 */
427
428/* USB Audio encodes frequencies with 3 bytes... */
429static void encode3(uint8_t arr[3], unsigned long freq)
430{
431 /* ugly */
432 arr[0] = freq & 0xff;
433 arr[1] = (freq >> 8) & 0xff;
434 arr[2] = (freq >> 16) & 0xff;
435}
436
437static unsigned long decode3(uint8_t arr[3])
438{
439 return arr[0] | (arr[1] << 8) | (arr[2] << 16);
440}
441
442// size is samples per frame!
443static void encodeFBfixedpt(uint8_t arr[4], int32_t value, bool portspeed)
444{
445 uint32_t fixedpt;
446 // high-speed
447 if (portspeed)
448 {
449 // Q16.16
450 fixedpt = value;
451
452 arr[0] = (fixedpt & 0xFF);
453 arr[1] = (fixedpt>>8) & 0xFF;
454 arr[2] = (fixedpt>>16) & 0xFF;
455 arr[3] = (fixedpt>>24) & 0xFF;
456 }
457 else // full-speed
458 {
459 // Q16.16 --> Q10.10 --> Q10.14
460 fixedpt = value / (1<<2); // convert from Q16.16 to Q10.14
461
462 // then aligned so it's more like Q10.14
463 // NOTE: this line left for posterity
464 // fixedpt = fixedpt << (4);
465
466 arr[0] = (fixedpt & 0xFF);
467 arr[1] = (fixedpt>>8) & 0xFF;
468 arr[2] = (fixedpt>>16) & 0xFF;
469 }
470
471}
472
473static void set_playback_sampling_frequency(unsigned long f)
474{
475 // only values 44.1k and higher (array is in descending order)
476 for(int i = 0; i <= HW_FREQ_44; i++)
477 {
478 /* compare errors */
479 int err = abs((long)hw_freq_sampr[i] - (long)f);
480 int best_err = abs((long)hw_freq_sampr[as_playback_freq_idx] - (long)f);
481 if(err < best_err)
482 as_playback_freq_idx = i;
483 }
484
485 logf("usbaudio: set playback sampling frequency to %lu Hz for a requested %lu Hz",
486 hw_freq_sampr[as_playback_freq_idx], f);
487
488 mixer_set_frequency(hw_freq_sampr[as_playback_freq_idx]);
489 pcm_apply_settings();
490}
491
492unsigned long usb_audio_get_playback_sampling_frequency(void)
493{
494 // logf("usbaudio: get playback sampl freq %lu Hz", hw_freq_sampr[as_playback_freq_idx]);
495 return hw_freq_sampr[as_playback_freq_idx];
496}
497
498void usb_audio_init(void)
499{
500 unsigned int i;
501 /* initialized tSamFreq array */
502 logf("usbaudio: (init) supported frequencies");
503 // only values 44.1k and higher (array is in descending order)
504 for(i = 0; i <= HW_FREQ_44; i++)
505 {
506 logf("usbaudio: %lu Hz", hw_freq_sampr[i]);
507 encode3(as_playback_format_type_i.tSamFreq[i], hw_freq_sampr[i]);
508 }
509}
510
511int usb_audio_request_buf(void)
512{
513 // stop playback first thing
514 audio_stop();
515
516 // attempt to allocate the receive buffers
517 rx_buffer_handle = core_alloc(REAL_BUF_SIZE);
518 if (rx_buffer_handle < 0)
519 {
520 alloc_failed = true;
521 return -1;
522 }
523 else
524 {
525 alloc_failed = false;
526
527 // "pin" the allocation so that the core does not move it in memory
528 core_pin(rx_buffer_handle);
529
530 // get the pointer to the actual buffer location
531 rx_buffer = core_get_data(rx_buffer_handle);
532 }
533
534 dsp_buf_handle = core_alloc(NR_BUFFERS * REAL_DSP_BUF_SIZE);
535 if (dsp_buf_handle < 0)
536 {
537 alloc_failed = true;
538 rx_buffer_handle = core_free(rx_buffer_handle);
539 rx_buffer = NULL;
540 return -1;
541 }
542 else
543 {
544 alloc_failed = false;
545
546 core_pin(dsp_buf_handle);
547
548 dsp_buf = core_get_data(dsp_buf_handle);
549 }
550 // logf("usbaudio: got buffer");
551 return 0;
552}
553
554void usb_audio_free_buf(void)
555{
556 // logf("usbaudio: free buffer");
557 rx_buffer_handle = core_free(rx_buffer_handle);
558 rx_buffer = NULL;
559
560 dsp_buf_handle = core_free(dsp_buf_handle);
561 dsp_buf = NULL;
562}
563
564int usb_audio_request_endpoints(struct usb_class_driver *drv)
565{
566 // make sure we can get the buffers first...
567 // return -1 if the allocation _failed_
568 if (usb_audio_request_buf())
569 return -1;
570
571 out_iso_ep_adr = usb_core_request_endpoint(USB_ENDPOINT_XFER_ISOC, USB_DIR_OUT, drv);
572 if(out_iso_ep_adr < 0)
573 {
574 logf("usbaudio: cannot get an out iso endpoint");
575 return -1;
576 }
577
578 in_iso_feedback_ep_adr = usb_core_request_endpoint(USB_ENDPOINT_XFER_ISOC, USB_DIR_IN, drv);
579 if(in_iso_feedback_ep_adr < 0)
580 {
581 usb_core_release_endpoint(out_iso_ep_adr);
582 logf("usbaudio: cannot get an in iso endpoint");
583 return -1;
584 }
585
586 logf("usbaudio: iso out ep is 0x%x, in ep is 0x%x", out_iso_ep_adr, in_iso_feedback_ep_adr);
587
588 as_iso_audio_out_ep.bEndpointAddress = out_iso_ep_adr;
589 as_iso_audio_out_ep.bSynchAddress = in_iso_feedback_ep_adr;
590
591 as_iso_synch_in_ep.bEndpointAddress = in_iso_feedback_ep_adr;
592 as_iso_synch_in_ep.bSynchAddress = 0;
593
594 return 0;
595}
596
597unsigned int usb_audio_get_out_ep(void)
598{
599 return out_iso_ep_adr;
600}
601
602unsigned int usb_audio_get_in_ep(void)
603{
604 return in_iso_feedback_ep_adr;
605}
606
607int usb_audio_set_first_interface(int interface)
608{
609 usb_interface = interface;
610 logf("usbaudio: usb_interface=%d", usb_interface);
611 return interface + 2; /* Audio Control and Audio Streaming */
612}
613
614int usb_audio_get_config_descriptor(unsigned char *dest, int max_packet_size)
615{
616 (void)max_packet_size;
617 unsigned int i;
618 unsigned char *orig_dest = dest;
619
620 logf("get config descriptors");
621
622 /** Configuration */
623
624 /* header */
625 ac_header.baInterfaceNr[0] = usb_interface + 1;
626
627 /* audio control interface */
628 ac_interface.bInterfaceNumber = usb_interface;
629
630 /* compute total size of AC headers*/
631 ac_header.wTotalLength = 0;
632 for(i = 0; i < AC_CS_DESCRIPTORS_LIST_SIZE; i++)
633 ac_header.wTotalLength += ac_cs_descriptors_list[i]->bLength;
634
635 /* audio streaming */
636 as_interface_alt_idle_playback.bInterfaceNumber = usb_interface + 1;
637 as_interface_alt_playback.bInterfaceNumber = usb_interface + 1;
638
639 /* endpoints */
640 as_iso_audio_out_ep.wMaxPacketSize = 1023;
641
642 /** Endpoint Interval calculation:
643 * typically sampling frequency is 44100 Hz and top is 192000 Hz, which
644 * account for typical 44100*2(stereo)*2(16-bit) ~= 180 kB/s
645 * and top 770 kB/s. Since there are ~1000 frames per seconds and maximum
646 * packet size is set to 1023, one transaction per frame is good enough
647 * for over 1 MB/s.
648 * Recall that actual is 2^(bInterval - 1) */
649
650 /* In simpler language, This is intended to emulate full-speed's
651 * one-packet-per-frame rate on high-speed, where we have multiple microframes per millisecond.
652 */
653 as_iso_audio_out_ep.bInterval = usb_drv_port_speed() ? 4 : 1;
654 as_iso_synch_in_ep.bInterval = usb_drv_port_speed() ? 4 : 1; // per spec
655
656 logf("usbaudio: port_speed=%s", usb_drv_port_speed()?"hs":"fs");
657
658 /** Packing */
659 for(i = 0; i < USB_DESCRIPTORS_LIST_SIZE; i++)
660 {
661 memcpy(dest, usb_descriptors_list[i], usb_descriptors_list[i]->bLength);
662 dest += usb_descriptors_list[i]->bLength;
663 }
664
665 return dest - orig_dest;
666}
667
668static void playback_audio_get_more(const void **start, size_t *size)
669{
670 /* if there are no more filled buffers, playback has just underflowed */
671 if(rx_play_idx == rx_usb_idx)
672 {
673 logf("usbaudio: playback underflow");
674 playback_audio_underflow = true;
675 *start = NULL;
676 *size = 0;
677 return;
678 }
679
680 /* give buffer and advance */
681 logf("usbaudio: buf adv");
682 *start = dsp_buf + (rx_play_idx * REAL_DSP_BUF_SIZE/sizeof(*dsp_buf));
683 *size = dsp_buf_size[rx_play_idx];
684 rx_play_idx = (rx_play_idx + 1) % NR_BUFFERS;
685
686 /* if usb RX buffers had overflowed, we can start to receive again
687 * guard against IRQ to avoid race with completion usb completion (although
688 * this function is probably running in IRQ context anyway) */
689 int oldlevel = disable_irq_save();
690 if(usb_rx_overflow)
691 {
692 logf("usbaudio: recover usb rx overflow");
693 usb_rx_overflow = false;
694 usb_drv_recv_nonblocking(out_iso_ep_adr, rx_buffer, BUFFER_SIZE);
695 }
696 restore_irq(oldlevel);
697}
698
699static void usb_audio_start_playback(void)
700{
701 usb_audio_playing = true;
702 usb_rx_overflow = false;
703 playback_audio_underflow = true;
704 rx_play_idx = 0;
705 rx_usb_idx = 0;
706
707 // feedback initialization
708 fb_startframe = usb_drv_get_frame_number();
709 samples_fb = 0;
710 samples_received_report = 0;
711
712 // debug screen info - frame drop counter
713 frames_dropped = 0;
714 last_frame = -1;
715 buffers_filled_min = -1;
716 buffers_filled_min_last = -1;
717 buffers_filled_max = -1;
718 buffers_filled_max_last = -1;
719
720 // debug screen info - sample counters
721 samples_received = 0;
722 samples_received_last = 0;
723
724 // TODO: implement recording from the USB stream
725#if (INPUT_SRC_CAPS != 0)
726 audio_set_input_source(AUDIO_SRC_PLAYBACK, SRCF_PLAYBACK);
727 audio_set_output_source(AUDIO_SRC_PLAYBACK);
728#endif
729 logf("usbaudio: start playback at %lu Hz", hw_freq_sampr[as_playback_freq_idx]);
730 mixer_set_frequency(hw_freq_sampr[as_playback_freq_idx]);
731 pcm_apply_settings();
732 mixer_channel_set_amplitude(PCM_MIXER_CHAN_USBAUDIO, MIX_AMP_UNITY);
733
734 usb_drv_recv_nonblocking(out_iso_ep_adr, rx_buffer, BUFFER_SIZE);
735}
736
737static void usb_audio_stop_playback(void)
738{
739 logf("usbaudio: stop playback");
740 if(usb_audio_playing)
741 {
742 mixer_channel_stop(PCM_MIXER_CHAN_USBAUDIO);
743 usb_audio_playing = false;
744 }
745 send_fb = false;
746}
747
748int usb_audio_set_interface(int intf, int alt)
749{
750 if(intf == usb_interface)
751 {
752 if(alt != 0)
753 {
754 logf("usbaudio: control interface has no alternate %d", alt);
755 return -1;
756 }
757
758 return 0;
759 }
760 if(intf == (usb_interface + 1))
761 {
762 if(alt < 0 || alt > 1)
763 {
764 logf("usbaudio: playback interface has no alternate %d", alt);
765 return -1;
766 }
767 usb_as_playback_intf_alt = alt;
768
769 if(usb_as_playback_intf_alt == 1)
770 usb_audio_start_playback();
771 else
772 usb_audio_stop_playback();
773 logf("usbaudio: use playback alternate %d", alt);
774
775 return 0;
776 }
777 else
778 {
779 logf("usbaudio: interface %d has no alternate", intf);
780 return -1;
781 }
782}
783
784int usb_audio_get_interface(int intf)
785{
786 if(intf == usb_interface)
787 {
788 logf("usbaudio: control interface alternate is 0");
789 return 0;
790 }
791 else if(intf == (usb_interface + 1))
792 {
793 logf("usbaudio: playback interface alternate is %d", usb_as_playback_intf_alt);
794 return usb_as_playback_intf_alt;
795 }
796 else
797 {
798 logf("usbaudio: unknown interface %d", intf);
799 return -1;
800 }
801}
802
803int usb_audio_get_main_intf(void)
804{
805 return usb_interface;
806}
807
808int usb_audio_get_alt_intf(void)
809{
810 return usb_as_playback_intf_alt;
811}
812
813int32_t usb_audio_get_samplesperframe(void)
814{
815 return samples_fb;
816}
817
818int32_t usb_audio_get_samples_rx_perframe(void)
819{
820 return samples_received_report;
821}
822
823static bool usb_audio_as_ctrldata_endpoint_request(struct usb_ctrlrequest* req, void *reqdata)
824{
825 /* only support sampling frequency */
826 if(req->wValue != (USB_AS_EP_CS_SAMPLING_FREQ_CTL << 8))
827 {
828 logf("usbaudio: endpoint only handles sampling frequency control");
829 return false;
830 }
831
832 switch(req->bRequest)
833 {
834 case USB_AC_SET_CUR:
835 if(req->wLength != 3)
836 {
837 logf("usbaudio: bad length for SET_CUR");
838 usb_drv_control_response(USB_CONTROL_STALL, NULL, 0);
839 return true;
840 }
841 logf("usbaudio: SET_CUR sampling freq");
842
843 if (reqdata) { /* control write, second pass */
844 set_playback_sampling_frequency(decode3(reqdata));
845 usb_drv_control_response(USB_CONTROL_ACK, NULL, 0);
846 return true;
847 } else { /* control write, first pass */
848 bool error = false;
849
850 if (req->wLength != 3)
851 error = true;
852 /* ... other validation? */
853
854 if (error)
855 usb_drv_control_response(USB_CONTROL_STALL, NULL, 0);
856 else
857 usb_drv_control_response(USB_CONTROL_RECEIVE, usb_buffer, 3);
858
859 return true;
860 }
861
862 case USB_AC_GET_CUR:
863 if(req->wLength != 3)
864 {
865 logf("usbaudio: bad length for GET_CUR");
866 usb_drv_control_response(USB_CONTROL_STALL, NULL, 0);
867 return true;
868 }
869 logf("usbaudio: GET_CUR sampling freq");
870 encode3(usb_buffer, usb_audio_get_playback_sampling_frequency());
871 usb_drv_control_response(USB_CONTROL_ACK, usb_buffer, req->wLength);
872
873 return true;
874
875 default:
876 logf("usbaudio: unhandled ep req 0x%x", req->bRequest);
877 }
878
879 return true;
880}
881
882static bool usb_audio_endpoint_request(struct usb_ctrlrequest* req, void *reqdata)
883{
884 int ep = req->wIndex & 0xff;
885
886 if(ep == out_iso_ep_adr)
887 return usb_audio_as_ctrldata_endpoint_request(req, reqdata);
888 else
889 {
890 logf("usbaudio: unhandled ep req (ep=%d)", ep);
891 return false;
892 }
893}
894
895static bool feature_unit_set_mute(int value, uint8_t cmd)
896{
897 if(cmd != USB_AC_CUR_REQ)
898 {
899 logf("usbaudio: feature unit MUTE control only has a CUR setting");
900 return false;
901 }
902
903 if(value == 1)
904 {
905 logf("usbaudio: mute !");
906 tmp_saved_vol = sound_current(SOUND_VOLUME);
907
908 // setvol does range checking for us!
909 global_status.volume = sound_min(SOUND_VOLUME);
910 setvol();
911 return true;
912 }
913 else if(value == 0)
914 {
915 logf("usbaudio: not muted !");
916
917 // setvol does range checking for us!
918 global_status.volume = tmp_saved_vol;
919 setvol();
920 return true;
921 }
922 else
923 {
924 logf("usbaudio: invalid value for CUR setting of feature unit (%d)", value);
925 return false;
926 }
927}
928
929static bool feature_unit_get_mute(int *value, uint8_t cmd)
930{
931 if(cmd != USB_AC_CUR_REQ)
932 {
933 logf("usbaudio: feature unit MUTE control only has a CUR setting");
934 return false;
935 }
936
937 *value = (sound_current(SOUND_VOLUME) == sound_min(SOUND_VOLUME));
938 return true;
939}
940
941/*
942* USB volume is a signed 16-bit value, -127.9961 dB (0x8001) to +127.9961 dB (0x7FFF)
943* in steps of 1/256 dB (0.00390625 dB)
944*
945* We need to account for different devices having different numbers of decimals
946*/
947// TODO: do we need to explicitly round these? Will we have a "walking" round conversion issue?
948// Step values of 1 dB (and multiples), and 0.5 dB should be able to be met exactly,
949// presuming that it starts on an even number.
950static int usb_audio_volume_to_db(int vol, int numdecimals)
951{
952 int tmp = (signed long)((signed short)vol * ipow(10, numdecimals)) / 256;
953 // logf("vol=0x%04X, numdecimals=%d, tmp=%d", vol, numdecimals, tmp);
954 return tmp;
955}
956static int db_to_usb_audio_volume(int db, int numdecimals)
957{
958 int tmp = (signed long)(db * 256) / ipow(10, numdecimals);
959 // logf("db=%d, numdecimals=%d, tmpTodB=%d", db, numdecimals, usb_audio_volume_to_db(tmp, numdecimals));
960 return tmp;
961}
962
963#if defined(LOGF_ENABLE) && defined(ROCKBOX_HAS_LOGF)
964static const char *usb_audio_ac_ctl_req_str(uint8_t cmd)
965{
966 switch(cmd)
967 {
968 case USB_AC_CUR_REQ: return "CUR";
969 case USB_AC_MIN_REQ: return "MIN";
970 case USB_AC_MAX_REQ: return "MAX";
971 case USB_AC_RES_REQ: return "RES";
972 case USB_AC_MEM_REQ: return "MEM";
973 default: return "<unknown>";
974 }
975}
976#endif
977
978static bool feature_unit_set_volume(int value, uint8_t cmd)
979{
980 if(cmd != USB_AC_CUR_REQ)
981 {
982 logf("usbaudio: feature unit VOLUME doesn't support %s setting", usb_audio_ac_ctl_req_str(cmd));
983 return false;
984 }
985
986 logf("usbaudio: set volume=%d dB", usb_audio_volume_to_db(value, sound_numdecimals(SOUND_VOLUME)));
987
988 // setvol does range checking for us!
989 // we cannot guarantee the host will send us a volume within our range
990 global_status.volume = usb_audio_volume_to_db(value, sound_numdecimals(SOUND_VOLUME));
991 setvol();
992 return true;
993}
994
995static bool feature_unit_get_volume(int *value, uint8_t cmd)
996{
997 switch(cmd)
998 {
999 case USB_AC_CUR_REQ: *value = db_to_usb_audio_volume(sound_current(SOUND_VOLUME), sound_numdecimals(SOUND_VOLUME)); break;
1000 case USB_AC_MIN_REQ: *value = db_to_usb_audio_volume(sound_min(SOUND_VOLUME), sound_numdecimals(SOUND_VOLUME)); break;
1001 case USB_AC_MAX_REQ: *value = db_to_usb_audio_volume(sound_max(SOUND_VOLUME), sound_numdecimals(SOUND_VOLUME)); break;
1002 case USB_AC_RES_REQ: *value = db_to_usb_audio_volume(sound_steps(SOUND_VOLUME), sound_numdecimals(SOUND_VOLUME)); break;
1003 default:
1004 logf("usbaudio: feature unit VOLUME doesn't support %s setting", usb_audio_ac_ctl_req_str(cmd));
1005 return false;
1006 }
1007
1008 // logf("usbaudio: get %s volume=%d dB", usb_audio_ac_ctl_req_str(cmd), usb_audio_volume_to_db(*value, sound_numdecimals(SOUND_VOLUME)));
1009 return true;
1010}
1011
1012int usb_audio_get_cur_volume(void)
1013{
1014 int vol;
1015 feature_unit_get_volume(&vol, USB_AC_CUR_REQ);
1016 return usb_audio_volume_to_db(vol, sound_numdecimals(SOUND_VOLUME));
1017}
1018
1019static bool usb_audio_set_get_feature_unit(struct usb_ctrlrequest* req, void *reqdata)
1020{
1021 int channel = req->wValue & 0xff;
1022 int selector = req->wValue >> 8;
1023 uint8_t cmd = (req->bRequest & ~USB_AC_GET_REQ);
1024 int value = 0;
1025 int i;
1026 bool handled;
1027
1028 /* master channel only */
1029 if(channel != 0)
1030 {
1031 logf("usbaudio: set/get on feature unit only apply to master channel (%d)", channel);
1032 return false;
1033 }
1034 /* selectors */
1035 /* all send/received values are integers already - read data if necessary and store in it in an integer */
1036 if(req->bRequest & USB_AC_GET_REQ)
1037 {
1038 /* get */
1039 switch(selector)
1040 {
1041 case USB_AC_FU_MUTE:
1042 handled = (req->wLength == 1) && feature_unit_get_mute(&value, cmd);
1043 break;
1044 case USB_AC_VOLUME_CONTROL:
1045 handled = (req->wLength == 2) && feature_unit_get_volume(&value, cmd);
1046 break;
1047 default:
1048 handled = false;
1049 logf("usbaudio: unhandled control selector of feature unit (0x%x)", selector);
1050 break;
1051 }
1052
1053 if(!handled)
1054 {
1055 logf("usbaudio: unhandled get control 0x%x selector 0x%x of feature unit", cmd, selector);
1056 usb_drv_control_response(USB_CONTROL_STALL, NULL, 0);
1057 return true;
1058 }
1059
1060 if(req->wLength == 0 || req->wLength > 4)
1061 {
1062 logf("usbaudio: get data payload size is invalid (%d)", req->wLength);
1063 return false;
1064 }
1065
1066 for(i = 0; i < req->wLength; i++)
1067 usb_buffer[i] = (value >> (8 * i)) & 0xff;
1068
1069 usb_drv_control_response(USB_CONTROL_ACK, usb_buffer, req->wLength);
1070 return true;
1071 }
1072 else
1073 {
1074 /* set */
1075 if(req->wLength == 0 || req->wLength > 4)
1076 {
1077 logf("usbaudio: set data payload size is invalid (%d)", req->wLength);
1078 return false;
1079 }
1080
1081 if (reqdata) {
1082
1083 for(i = 0; i < req->wLength; i++)
1084 value = value | (usb_buffer[i] << (i * 8));
1085
1086 switch(selector)
1087 {
1088 case USB_AC_FU_MUTE:
1089 handled = (req->wLength == 1) && feature_unit_set_mute(value, cmd);
1090 break;
1091 case USB_AC_VOLUME_CONTROL:
1092 handled = (req->wLength == 2) && feature_unit_set_volume(value, cmd);
1093 break;
1094 default:
1095 handled = false;
1096 logf("usbaudio: unhandled control selector of feature unit (0x%x)", selector);
1097 break;
1098 }
1099
1100 if(!handled)
1101 {
1102 logf("usbaudio: unhandled set control 0x%x selector 0x%x of feature unit", cmd, selector);
1103 usb_drv_control_response(USB_CONTROL_STALL, NULL, 0);
1104 return true;
1105 }
1106
1107 usb_drv_control_response(USB_CONTROL_ACK, NULL, 0);
1108 return true;
1109 } else {
1110 /*
1111 * should handle the following (req->wValue >> 8):
1112 * USB_AC_FU_MUTE
1113 * USB_AC_VOLUME_CONTROL
1114 */
1115
1116 bool error = false;
1117
1118 if (error)
1119 usb_drv_control_response(USB_CONTROL_STALL, NULL, 0);
1120 else
1121 usb_drv_control_response(USB_CONTROL_RECEIVE, usb_buffer, 3);
1122
1123 return true;
1124 }
1125
1126 return true;
1127 }
1128}
1129
1130static bool usb_audio_ac_set_get_request(struct usb_ctrlrequest* req, void *reqdata)
1131{
1132 switch(req->wIndex >> 8)
1133 {
1134 case AC_PLAYBACK_FEATURE_ID:
1135 return usb_audio_set_get_feature_unit(req, reqdata);
1136 default:
1137 logf("usbaudio: unhandled set/get on entity %d", req->wIndex >> 8);
1138 return false;
1139 }
1140}
1141
1142static bool usb_audio_interface_request(struct usb_ctrlrequest* req, void *reqdata)
1143{
1144 int intf = req->wIndex & 0xff;
1145
1146 if(intf == usb_interface)
1147 {
1148 switch(req->bRequest)
1149 {
1150 case USB_AC_SET_CUR: case USB_AC_SET_MIN: case USB_AC_SET_MAX: case USB_AC_SET_RES:
1151 case USB_AC_SET_MEM: case USB_AC_GET_CUR: case USB_AC_GET_MIN: case USB_AC_GET_MAX:
1152 case USB_AC_GET_RES: case USB_AC_GET_MEM:
1153 return usb_audio_ac_set_get_request(req, reqdata);
1154 default:
1155 logf("usbaudio: unhandled ac intf req 0x%x", req->bRequest);
1156 return false;
1157 }
1158 }
1159 else
1160 {
1161 logf("usbaudio: unhandled intf req (intf=%d)", intf);
1162 return false;
1163 }
1164}
1165
1166bool usb_audio_control_request(struct usb_ctrlrequest* req, void *reqdata, unsigned char* dest)
1167{
1168 (void) reqdata;
1169 (void) dest;
1170
1171 switch(req->bRequestType & USB_RECIP_MASK)
1172 {
1173 case USB_RECIP_ENDPOINT:
1174 return usb_audio_endpoint_request(req, reqdata);
1175 case USB_RECIP_INTERFACE:
1176 return usb_audio_interface_request(req, reqdata);
1177 default:
1178 logf("usbaudio: unhandled req type 0x%x", req->bRequestType);
1179 return false;
1180 }
1181}
1182
1183void usb_audio_init_connection(void)
1184{
1185 logf("usbaudio: init connection");
1186
1187 usbaudio_active = true;
1188 dsp = dsp_get_config(CODEC_IDX_AUDIO);
1189 dsp_configure(dsp, DSP_RESET, 0);
1190 dsp_configure(dsp, DSP_SET_STEREO_MODE, STEREO_INTERLEAVED);
1191 dsp_configure(dsp, DSP_SET_SAMPLE_DEPTH, 16);
1192#ifdef HAVE_PITCHCONTROL
1193 sound_set_pitch(PITCH_SPEED_100);
1194 dsp_set_timestretch(PITCH_SPEED_100);
1195#endif
1196
1197 usb_as_playback_intf_alt = 0;
1198 set_playback_sampling_frequency(HW_SAMPR_DEFAULT);
1199 tmp_saved_vol = sound_current(SOUND_VOLUME);
1200 usb_audio_playing = false;
1201}
1202
1203void usb_audio_disconnect(void)
1204{
1205 logf("usbaudio: disconnect");
1206
1207 usb_audio_stop_playback();
1208 usb_audio_free_buf();
1209 usbaudio_active = false;
1210}
1211
1212bool usb_audio_get_active(void)
1213{
1214 return usbaudio_active;
1215}
1216
1217bool usb_audio_get_alloc_failed(void)
1218{
1219 return alloc_failed;
1220}
1221
1222bool usb_audio_get_playing(void)
1223{
1224 return usb_audio_playing;
1225}
1226
1227/* determine if enough prebuffering has been done to restart audio */
1228bool prebuffering_done(void)
1229{
1230 /* restart audio if at least MINIMUM_BUFFERS_QUEUED buffers are filled */
1231 int diff = (rx_usb_idx - rx_play_idx + NR_BUFFERS) % NR_BUFFERS;
1232 return diff >= MINIMUM_BUFFERS_QUEUED;
1233}
1234
1235int usb_audio_get_prebuffering(void)
1236{
1237 return (rx_usb_idx - rx_play_idx + NR_BUFFERS) % NR_BUFFERS;
1238}
1239
1240int32_t usb_audio_get_prebuffering_avg(void)
1241{
1242 if (buffers_filled_avgcount == 0)
1243 {
1244 return TO_16DOT16_FIXEDPT(usb_audio_get_prebuffering());
1245 } else {
1246 return (TO_16DOT16_FIXEDPT(buffers_filled_accumulator)/buffers_filled_avgcount) + TO_16DOT16_FIXEDPT(MINIMUM_BUFFERS_QUEUED);
1247 }
1248}
1249
1250int usb_audio_get_prebuffering_maxmin(bool max)
1251{
1252 if (max)
1253 {
1254 return buffers_filled_max == -1 ? buffers_filled_max_last : buffers_filled_max;
1255 }
1256 else
1257 {
1258 return buffers_filled_min == -1 ? buffers_filled_min_last : buffers_filled_min;
1259 }
1260}
1261
1262bool usb_audio_get_underflow(void)
1263{
1264 return playback_audio_underflow;
1265}
1266
1267bool usb_audio_get_overflow(void)
1268{
1269 return usb_rx_overflow;
1270}
1271
1272int usb_audio_get_frames_dropped(void)
1273{
1274 return frames_dropped;
1275}
1276
1277void usb_audio_transfer_complete(int ep, int dir, int status, int length)
1278{
1279 /* normal handler is too slow to handle the completion rate, because
1280 * of the low thread schedule rate */
1281 (void) ep;
1282 (void) dir;
1283 (void) status;
1284 (void) length;
1285}
1286
1287bool usb_audio_fast_transfer_complete(int ep, int dir, int status, int length)
1288{
1289 (void) dir;
1290 bool retval = false;
1291
1292 if(ep == out_iso_ep_adr && usb_as_playback_intf_alt == 1)
1293 {
1294 // check for dropped frames
1295 if (last_frame != usb_drv_get_frame_number())
1296 {
1297 if ((((last_frame + 1) % (USB_FRAME_MAX + 1)) != usb_drv_get_frame_number()) && (last_frame != -1))
1298 {
1299 frames_dropped++;
1300 }
1301 last_frame = usb_drv_get_frame_number();
1302 }
1303
1304 // If audio and feedback EPs happen to have the same base number (with opposite directions, of course),
1305 // we will get replies to the feedback here, don't want that to be interpreted as data.
1306 if (length <= 4)
1307 {
1308 return true;
1309 }
1310
1311 logf("usbaudio: frame: %d bytes: %d", usb_drv_get_frame_number(), length);
1312 if(status != 0)
1313 return true; /* FIXME how to handle error here ? */
1314
1315 /* store length, queue buffer */
1316 rx_buf_size[rx_usb_idx] = length;
1317
1318 // debug screen counter
1319 samples_received = samples_received + length;
1320
1321 // process through DSP right away!
1322 struct dsp_buffer src;
1323 src.remcount = length/4; // in samples
1324 src.pin[0] = rx_buffer;
1325 src.proc_mask = 0;
1326
1327 struct dsp_buffer dst;
1328 dst.remcount = 0;
1329 dst.bufcount = DSP_BUF_SIZE/4; // in samples
1330 dst.p16out = dsp_buf + (rx_usb_idx * REAL_DSP_BUF_SIZE/sizeof(*dsp_buf)); // array index
1331
1332 dsp_process(dsp, &src, &dst, false);
1333 dsp_buf_size[rx_usb_idx] = dst.remcount * 2 * sizeof(*dsp_buf); // need value in bytes
1334
1335 rx_usb_idx = (rx_usb_idx + 1) % NR_BUFFERS;
1336
1337 /* guard against IRQ to avoid race with completion audio completion */
1338 int oldlevel = disable_irq_save();
1339 /* setup a new transaction except if we ran out of buffers */
1340 if(rx_usb_idx != rx_play_idx)
1341 {
1342 logf("usbaudio: new transaction");
1343 usb_drv_recv_nonblocking(out_iso_ep_adr, rx_buffer, BUFFER_SIZE);
1344 }
1345 else
1346 {
1347 logf("usbaudio: rx overflow");
1348 usb_rx_overflow = true;
1349 }
1350 /* if audio underflowed and prebuffering is done, restart audio */
1351 if(playback_audio_underflow && prebuffering_done())
1352 {
1353 logf("usbaudio: prebuffering done");
1354 playback_audio_underflow = false;
1355 usb_rx_overflow = false;
1356 mixer_channel_play_data(PCM_MIXER_CHAN_USBAUDIO, playback_audio_get_more, NULL, 0);
1357 }
1358 restore_irq(oldlevel);
1359 retval = true;
1360 }
1361 else
1362 {
1363 retval = false;
1364 }
1365
1366 // send feedback value every N frames!
1367 // NOTE: important that we need to queue this up _the frame before_ it's needed - on MacOS especially!
1368 if ((usb_drv_get_frame_number()+1) % FEEDBACK_UPDATE_RATE_FRAMES == 0 && send_fb)
1369 {
1370 if (!sent_fb_this_frame)
1371 {
1372 /* NOTE: the division of frequency must be staged to avoid overflow of 16-bit signed int
1373 * as well as truncating the result to ones place!
1374 * Must avoid values > 32,768 (2^15)
1375 * Largest value: 192,000 --> /10: 19,200 --> /100: 192
1376 * Smallest value: 44,100 --> /10: 4,410 --> /100: 44.1
1377 */
1378 int32_t samples_base = TO_16DOT16_FIXEDPT(hw_freq_sampr[as_playback_freq_idx]/10)/100;
1379 int32_t buffers_filled = 0;
1380
1381 if (buffers_filled_avgcount != 0)
1382 {
1383 buffers_filled = TO_16DOT16_FIXEDPT((int32_t)buffers_filled_accumulator) / buffers_filled_avgcount;
1384 }
1385 buffers_filled_accumulator = buffers_filled_accumulator - buffers_filled_accumulator_old;
1386 buffers_filled_avgcount = buffers_filled_avgcount - buffers_filled_avgcount_old;
1387 buffers_filled_accumulator_old = buffers_filled_accumulator;
1388 buffers_filled_avgcount_old = buffers_filled_avgcount;
1389
1390 // someone who has implemented actual PID before might be able to do this correctly,
1391 // but this seems to work good enough?
1392 // Coefficients were 1, 0.25, 0.025 in float math --> 1, /4, /40 in fixed-point math
1393 samples_fb = samples_base - (buffers_filled/4) + ((buffers_filled_old - buffers_filled)/40);
1394 buffers_filled_old = buffers_filled;
1395
1396 // must limit to +/- 1 sample from nominal
1397 samples_fb = samples_fb > (samples_base + TO_16DOT16_FIXEDPT(1)) ? samples_base + TO_16DOT16_FIXEDPT(1) : samples_fb;
1398 samples_fb = samples_fb < (samples_base - TO_16DOT16_FIXEDPT(1)) ? samples_base - TO_16DOT16_FIXEDPT(1) : samples_fb;
1399
1400 encodeFBfixedpt(sendFf, samples_fb, usb_drv_port_speed());
1401 logf("usbaudio: frame %d fbval 0x%02X%02X%02X%02X", usb_drv_get_frame_number(), sendFf[3], sendFf[2], sendFf[1], sendFf[0]);
1402 usb_drv_send_nonblocking(in_iso_feedback_ep_adr, sendFf, usb_drv_port_speed()?4:3);
1403
1404 // debug screen counters
1405 //
1406 // samples_received NOTE: need some "division staging" to not overflow signed 16-bit value
1407 // samples / (feedback frames * 2) --> samples/2
1408 // samples_report / (2ch * 2bytes per sample) --> samples/4
1409 // total: samples/8
1410 samples_received_report = TO_16DOT16_FIXEDPT(samples_received/8) / FEEDBACK_UPDATE_RATE_FRAMES;
1411 samples_received = samples_received - samples_received_last;
1412 samples_received_last = samples_received;
1413 buffers_filled_max_last = buffers_filled_max;
1414 buffers_filled_max = -1;
1415 buffers_filled_min_last = buffers_filled_min;
1416 buffers_filled_min = -1;
1417 }
1418 sent_fb_this_frame = true;
1419 }
1420 else
1421 {
1422 sent_fb_this_frame = false;
1423 if (!send_fb)
1424 {
1425 // arbitrary wait during startup
1426 if (usb_drv_get_frame_number() == (fb_startframe + (FEEDBACK_UPDATE_RATE_FRAMES*2))%(USB_FRAME_MAX+1))
1427 {
1428 send_fb = true;
1429 }
1430 }
1431 buffers_filled_accumulator = buffers_filled_accumulator + (usb_audio_get_prebuffering() - MINIMUM_BUFFERS_QUEUED);
1432 buffers_filled_avgcount++;
1433 if (usb_audio_get_prebuffering() < buffers_filled_min || buffers_filled_min == -1)
1434 {
1435 buffers_filled_min = usb_audio_get_prebuffering();
1436 } else if (usb_audio_get_prebuffering() > buffers_filled_max)
1437 {
1438 buffers_filled_max = usb_audio_get_prebuffering();
1439 }
1440 }
1441
1442 return retval;
1443}