|
|
|
|
|
|
|
|
// means we no longer get receive callbacks from usb_dev. |
|
|
// means we no longer get receive callbacks from usb_dev. |
|
|
update_responsibility = false; |
|
|
update_responsibility = false; |
|
|
usb_audio_sync_feedback = 722824; |
|
|
usb_audio_sync_feedback = 722824; |
|
|
|
|
|
usb_audio_sync_feedback = 723700; // too fast? |
|
|
|
|
|
//usb_audio_sync_feedback = 722534; // too slow |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void copy_to_buffers(const uint32_t *src, int16_t *left, int16_t *right, unsigned int len) |
|
|
static void copy_to_buffers(const uint32_t *src, int16_t *left, int16_t *right, unsigned int len) |
|
|
|
|
|
|
|
|
copy_to_buffers(data, left->data + count, right->data + count, len); |
|
|
copy_to_buffers(data, left->data + count, right->data + count, len); |
|
|
AudioInputUSB::incoming_count = count + len; |
|
|
AudioInputUSB::incoming_count = count + len; |
|
|
return; |
|
|
return; |
|
|
} else { |
|
|
|
|
|
|
|
|
} else if (avail > 0) { |
|
|
//serial_print("^"); |
|
|
//serial_print("^"); |
|
|
copy_to_buffers(data, left->data + count, right->data + count, avail); |
|
|
copy_to_buffers(data, left->data + count, right->data + count, avail); |
|
|
data += avail; |
|
|
data += avail; |
|
|
len -= avail; |
|
|
len -= avail; |
|
|
if (AudioInputUSB::ready_left) // buffer overrun, PC sending too fast |
|
|
|
|
|
AudioStream::release(AudioInputUSB::ready_left); |
|
|
|
|
|
|
|
|
if (AudioInputUSB::ready_left || AudioInputUSB::ready_right) { |
|
|
|
|
|
// buffer overrun, PC sending too fast |
|
|
|
|
|
AudioInputUSB::incoming_count = count + avail; |
|
|
|
|
|
serial_print("!"); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
send: |
|
|
AudioInputUSB::ready_left = left; |
|
|
AudioInputUSB::ready_left = left; |
|
|
if (AudioInputUSB::ready_right) |
|
|
|
|
|
AudioStream::release(AudioInputUSB::ready_right); |
|
|
|
|
|
AudioInputUSB::ready_right = right; |
|
|
AudioInputUSB::ready_right = right; |
|
|
if (AudioInputUSB::update_responsibility) AudioStream::update_all(); |
|
|
|
|
|
|
|
|
//if (AudioInputUSB::update_responsibility) AudioStream::update_all(); |
|
|
left = AudioStream::allocate(); |
|
|
left = AudioStream::allocate(); |
|
|
if (left == NULL) { |
|
|
if (left == NULL) { |
|
|
AudioInputUSB::incoming_left = NULL; |
|
|
AudioInputUSB::incoming_left = NULL; |
|
|
|
|
|
|
|
|
} else { |
|
|
} else { |
|
|
count = 0; |
|
|
count = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
if (AudioInputUSB::ready_left || AudioInputUSB::ready_right) return; |
|
|
|
|
|
goto send; // recover from buffer overrun |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
AudioInputUSB::incoming_count = count; |
|
|
AudioInputUSB::incoming_count = count; |
|
|
|
|
|
|
|
|
//serial_print("."); |
|
|
//serial_print("."); |
|
|
if (!left || !right) { |
|
|
if (!left || !right) { |
|
|
underflow_flag = 1; |
|
|
underflow_flag = 1; |
|
|
//serial_print("#"); // buffer underrun - PC sending too slow |
|
|
|
|
|
|
|
|
serial_print("#"); // buffer underrun - PC sending too slow |
|
|
} |
|
|
} |
|
|
if (left) { |
|
|
if (left) { |
|
|
transmit(left, 0); |
|
|
transmit(left, 0); |