/* * udi_audio.c */ //===================== DAC/Speaker Interface ===================== UDC_DESC_STORAGE udi_api_t udi_api_audio_out_stream = { .enable = udi_audio_stream_out_enable, .disable = udi_audio_stream_out_disable, .setup = udi_audio_stream_out_setup, .getsetting = udi_audio_stream_out_getsetting, .sof_notify = udi_audio_stream_out_SOF_routine, }; //SOF routine provides Feedback data to IN endpoint static void udi_audio_stream_out_SOF_routine(void){ #if (SPEAKER_FB_EP_ENABLED) if (udi_audio_out_alt_setting) { if (FB_EP_start_counter) { //read current timer value FB_EP_tc_last_val = tc_get_count_value(&tc_instance); //reset flag FB_EP_start_counter = false; return; } //4 ms refresh cycle if (++FB_EP_SOF_count == UDI_AUDIO_OUT_FB_EP_IN_POLL_RATE_MS) { //read current timer value FB_EP_tc_cur_val = tc_get_count_value(&tc_instance); //check for buffer overflow if (FB_EP_tc_cur_val > FB_EP_tc_last_val) { //buffer has not overflowed FB_EP_tmp = FB_EP_tc_cur_val - FB_EP_tc_last_val; } else { //buffer has overflowed FB_EP_tmp = FB_EP_tc_cur_val - FB_EP_tc_last_val + 65536; } FB_EP_tmp /= 1024; //49152 / 1024 = 48 //convert new fb value and store to array FB_EP_val_1014 = ConvFloatTo1014(FB_EP_tmp); PutBytesToBuf(FB_EP_IN_BUF, FB_EP_val_1014); //reset counter for averaging FB_EP_SOF_count = 0; //read current timer value FB_EP_tc_last_val = tc_get_count_value(&tc_instance); return; } } #endif } static bool udi_audio_stream_out_enable(void) { udi_audio_out_alt_setting = udc_get_interface_desc()->bAlternateSetting; if (udi_audio_out_alt_setting) // Alternate Setting 1 (streaming on) { // start streaming startOutStreaming = 1; speaker_fifo.buf_write_block_index = 0; speaker_fifo.buf_write_sample_index = 0; #if (SPEAKER_TMP_BUFFERS_ENABLE) tx_tmp_buffer_index = 0; #endif #if (SPEAKER_FB_EP_ENABLED) //get first timer value FB_EP_start_counter = true; udd_ep_run(UDI_AUDIO_OUT_FB_EP_IN, true, (uint8_t*) &FB_EP_IN_BUF, UDI_AUDIO_OUT_FB_EP_IN_PACKETSIZE, NULL); #endif if(!udi_audio_stream_out_start()) return false; startOutStreaming = 1; } else // Alternate Setting 0 (streaming off) { // stop streaming startOutStreaming = 0; udi_audio_stream_out_stop(); } return true; } #endif