|
|
@@ -36,6 +36,11 @@ |
|
|
|
#ifdef AUDIO_INTERFACE // defined by usb_dev.h -> usb_desc.h |
|
|
|
#if F_CPU >= 20000000 |
|
|
|
|
|
|
|
// Uncomment this to work around a limitation in Macintosh adaptive rates |
|
|
|
// This is not a perfect solution. Details here: |
|
|
|
// https://forum.pjrc.com/threads/34855-Distorted-audio-when-using-USB-input-on-Teensy-3-1 |
|
|
|
//#define MACOSX_ADAPTIVE_LIMIT |
|
|
|
|
|
|
|
bool AudioInputUSB::update_responsibility; |
|
|
|
audio_block_t * AudioInputUSB::incoming_left; |
|
|
|
audio_block_t * AudioInputUSB::incoming_right; |
|
|
@@ -67,9 +72,7 @@ void AudioInputUSB::begin(void) |
|
|
|
// but also because the PC may stop transmitting data, which |
|
|
|
// means we no longer get receive callbacks from usb_dev. |
|
|
|
update_responsibility = false; |
|
|
|
//usb_audio_sync_feedback = 722824; |
|
|
|
//usb_audio_sync_feedback = 723700; // too fast? |
|
|
|
usb_audio_sync_feedback = 722534; // too slow |
|
|
|
usb_audio_sync_feedback = feedback_accumulator >> 8; |
|
|
|
} |
|
|
|
|
|
|
|
static void copy_to_buffers(const uint32_t *src, int16_t *left, int16_t *right, unsigned int len) |
|
|
@@ -187,9 +190,12 @@ void AudioInputUSB::update(void) |
|
|
|
__enable_irq(); |
|
|
|
if (f) { |
|
|
|
int diff = AUDIO_BLOCK_SAMPLES/2 - (int)c; |
|
|
|
feedback_accumulator += diff; |
|
|
|
// TODO: min/max sanity check for feedback_accumulator?? |
|
|
|
usb_audio_sync_feedback = (feedback_accumulator >> 8) + diff * 3; |
|
|
|
feedback_accumulator += diff / 3; |
|
|
|
uint32_t feedback = (feedback_accumulator >> 8) + diff * 100; |
|
|
|
#ifdef MACOSX_ADAPTIVE_LIMIT |
|
|
|
if (feedback > 722698) feedback = 722698; |
|
|
|
#endif |
|
|
|
usb_audio_sync_feedback = feedback; |
|
|
|
//if (diff > 0) { |
|
|
|
//serial_print("."); |
|
|
|
//} else if (diff < 0) { |
|
|
@@ -200,7 +206,7 @@ void AudioInputUSB::update(void) |
|
|
|
//serial_print("."); |
|
|
|
if (!left || !right) { |
|
|
|
//serial_print("#"); // buffer underrun - PC sending too slow |
|
|
|
if (f) feedback_accumulator += 10 << 8; |
|
|
|
//if (f) feedback_accumulator += 10 << 8; |
|
|
|
} |
|
|
|
if (left) { |
|
|
|
transmit(left, 0); |