|
-
-
- #include "usb_audio.h"
- #include "HardwareSerial.h"
- #include <string.h> // for memcpy()
-
- #ifdef AUDIO_INTERFACE
- #if F_CPU >= 20000000
-
- bool AudioInputUSB::update_responsibility;
- audio_block_t * AudioInputUSB::incoming_left;
- audio_block_t * AudioInputUSB::incoming_right;
- audio_block_t * AudioInputUSB::ready_left;
- audio_block_t * AudioInputUSB::ready_right;
- uint16_t AudioInputUSB::incoming_count;
- uint8_t AudioInputUSB::underflow_flag;
-
- #define DMABUFATTR __attribute__ ((section(".dmabuffers"), aligned (4)))
- uint16_t usb_audio_receive_buffer[AUDIO_RX_SIZE/2] DMABUFATTR;
- uint16_t usb_audio_transmit_buffer[AUDIO_TX_SIZE/2] DMABUFATTR;
- uint32_t usb_audio_sync_feedback DMABUFATTR;
-
- void AudioInputUSB::begin(void)
- {
- incoming_count = 0;
- incoming_left = NULL;
- incoming_right = NULL;
- ready_left = NULL;
- ready_right = NULL;
- underflow_flag = 1;
-
-
-
-
-
- update_responsibility = false;
- usb_audio_sync_feedback = 722824;
- }
-
- static void copy_to_buffers(const uint32_t *src, int16_t *left, int16_t *right, unsigned int len)
- {
-
- while (len > 0) {
- uint32_t n = *src++;
- *left++ = n & 0xFFFF;
- *right++ = n >> 16;
- len--;
- }
- }
-
-
-
-
- void usb_audio_receive_callback(unsigned int len)
- {
- unsigned int count, avail;
- audio_block_t *left, *right;
- const uint32_t *data;
-
- len >>= 2;
- data = (const uint32_t *)usb_audio_receive_buffer;
-
-
-
-
- count = AudioInputUSB::incoming_count;
- left = AudioInputUSB::incoming_left;
- right = AudioInputUSB::incoming_right;
- if (left == NULL) {
- left = AudioStream::allocate();
- if (left == NULL) return;
- AudioInputUSB::incoming_left = left;
- }
- if (right == NULL) {
- right = AudioStream::allocate();
- if (right == NULL) return;
- AudioInputUSB::incoming_right = right;
- }
- while (len > 0) {
- avail = AUDIO_BLOCK_SAMPLES - count;
- if (len < avail) {
-
- copy_to_buffers(data, left->data + count, right->data + count, len);
- AudioInputUSB::incoming_count = count + len;
- return;
- } else {
-
- copy_to_buffers(data, left->data + count, right->data + count, avail);
- data += avail;
- len -= avail;
- if (AudioInputUSB::ready_left)
- AudioStream::release(AudioInputUSB::ready_left);
- AudioInputUSB::ready_left = left;
- if (AudioInputUSB::ready_right)
- AudioStream::release(AudioInputUSB::ready_right);
- AudioInputUSB::ready_right = right;
- if (AudioInputUSB::update_responsibility) AudioStream::update_all();
- left = AudioStream::allocate();
- if (left == NULL) {
- AudioInputUSB::incoming_left = NULL;
- AudioInputUSB::incoming_right = NULL;
- AudioInputUSB::incoming_count = 0;
- return;
- }
- right = AudioStream::allocate();
- if (right == NULL) {
- AudioStream::release(left);
- AudioInputUSB::incoming_left = NULL;
- AudioInputUSB::incoming_right = NULL;
- AudioInputUSB::incoming_count = 0;
- return;
- }
- AudioInputUSB::incoming_left = left;
- AudioInputUSB::incoming_right = right;
- if (AudioInputUSB::underflow_flag) {
- AudioInputUSB::underflow_flag = 0;
- memset(left->data + count, 0, AUDIO_BLOCK_SAMPLES);
- memset(right->data + count, 0, AUDIO_BLOCK_SAMPLES);
- count = AUDIO_BLOCK_SAMPLES/2;
- serial_print("*");
- } else {
- count = 0;
- }
- }
- }
- AudioInputUSB::incoming_count = count;
- }
-
- void AudioInputUSB::update(void)
- {
- audio_block_t *left, *right;
-
- __disable_irq();
- left = ready_left;
- ready_left = NULL;
- right = ready_right;
- ready_right = NULL;
-
- uint16_t c = incoming_count;
- __enable_irq();
-
-
- if (!left || !right) {
- underflow_flag = 1;
-
- }
- if (left) {
- transmit(left, 0);
- release(left);
- }
- if (right) {
- transmit(right, 1);
- release(right);
- }
- }
-
-
-
-
-
-
-
-
- unsigned int usb_audio_transmit_callback(void)
- {
- return 0;
- }
-
-
- #endif
- #endif
|