Atmel Software Framework

usb_stream_player.c File Reference
#include <stdio.h>
#include "conf_usb.h"
#include "conf_audio_player.h"
#include "audio_mixer.h"
#include "usb_drv.h"
#include "usb_stream_player.h"
#include "cycle_counter.h"
#include "gpio.h"
#include "debug.h"

Macros

#define BROKEN_STREAM_TIMER   4000
 

Functions

void dac_sample_sent_cb (void)
 This callback function is called when the DAC interrupt has sent the buffer 'n-1' and switches to buffer 'n'. More...
 
void dac_underflow_cb (void)
 This callback function is called when the PWM DAC interrupt does not have any more audio samples (i.e. More...
 
void player_init (void)
 
void player_shutdown (void)
 
uint32_t usb_stream_get_buffer_level ()
 This function returns the number of full buffers. More...
 
uint16_t usb_stream_get_counter ()
 This function returns the internal audio counter. More...
 
uint16_t usb_stream_get_stream_status ()
 This function returns the audio status. More...
 
void usb_stream_init (uint32_t sample_rate_hz, uint8_t num_channels, uint8_t bits_per_sample, bool swap_channels)
 This function initializes the USB Stream driver. More...
 
int usb_stream_input (usb_stream_side_t side, uint8_t pipe_in, uint32_t *pFifoCount)
 This function takes the stream coming from the selected USB pipe and sends it to the DAC driver. More...
 
bool usb_stream_new_sample_rate (uint32_t sample_rate)
 Sync the sample rate of the audio output stream with the USB stream. More...
 
int32_t usb_stream_ppm_get (void)
 This function returns the PPM differences between the input audio stream frequency and the DAC output frequency. More...
 
void usb_stream_resync (void)
 This function monitors the buffering level and set a timer for the resynchronization. More...
 

Variables

static t_cpu_time broken_stream_timer
 
uint32_t buf_trace []
 
volatile uint16_t usb_stream_cnt =0
 
usb_stream_context_tusb_stream_context = NULL
 
t_cpu_time usb_stream_monitor_timer
 
static uint32_t usb_stream_real_sample_freq =0
 
static bool usb_stream_resync_b_acting =false
 
static uint16_t usb_stream_resync_last_room =0
 
static int16_t usb_stream_resync_ppm =0
 
t_cpu_time usb_stream_resync_timer
 

#define BROKEN_STREAM_TIMER   4000

void dac_sample_sent_cb ( void  )

This callback function is called when the DAC interrupt has sent the buffer 'n-1' and switches to buffer 'n'.

The aim of this function is thus to prepare the buffer 'n+1'; so that there is always a pending buffer for the interrupt.

void dac_underflow_cb ( void  )

This callback function is called when the PWM DAC interrupt does not have any more audio samples (i.e.

"famine").

void player_init ( void  )
void player_shutdown ( void  )
uint32_t usb_stream_get_buffer_level ( void  )

This function returns the number of full buffers.

uint16_t usb_stream_get_counter ( void  )

This function returns the internal audio counter.

uint16_t usb_stream_get_stream_status ( void  )

This function returns the audio status.

void usb_stream_init ( uint32_t  sample_rate_hz,
uint8_t  num_channels,
uint8_t  bits_per_sample,
bool  swap_channels 
)

This function initializes the USB Stream driver.

Referenced by audio_speaker_set_sample_freq(), device_audio_task_init(), host_audio_task(), and usb_stream_new_sample_rate().

int usb_stream_input ( usb_stream_side_t  side,
uint8_t  pipe_in,
uint32_t *  pFifoCount 
)

This function takes the stream coming from the selected USB pipe and sends it to the DAC driver.

Moreover, it ensures that both input and output stream keep synchronized by adding or deleting samples.

Parameters
sideUSB_STREAM_HOST for USB host, USB_STREAM_DEVICE for device.
pipe_inNumber of the addressed pipe/endpoint
pFifoCount(return parameter) NULL or pointer to the number of used buffers at this time
Returns
status: (USB_STREAM_STATUS_OK, USB_STREAM_STATUS_NOT_SYNCHRONIZED, USB_STREAM_STATUS_SPEED_UP, USB_STREAM_STATUS_SLOW_DOWN, USB_STREAM_STATUS_BUFFER_OVERFLOW)

Referenced by device_audio_task(), and host_audio_task().

bool usb_stream_new_sample_rate ( uint32_t  sample_rate)

Sync the sample rate of the audio output stream with the USB stream.

Return values
falseThe new sample rate already matches the current settings.
trueThe output sample rate was changed.
int32_t usb_stream_ppm_get ( void  )

This function returns the PPM differences between the input audio stream frequency and the DAC output frequency.

Note that this information should only be considered as an indication, for debug or visual effect for example.

Referenced by mmi_activity_display().

void usb_stream_resync ( void  )

This function monitors the buffering level and set a timer for the resynchronization.

This will ensures that no underflow/underflow will never occur by inserting/removing samples.

Referenced by device_audio_task(), host_audio_task(), and usb_stream_input().

t_cpu_time broken_stream_timer
static
uint32_t buf_trace[]
volatile uint16_t usb_stream_cnt =0
usb_stream_context_t* usb_stream_context = NULL
t_cpu_time usb_stream_monitor_timer
uint32_t usb_stream_real_sample_freq =0
static
bool usb_stream_resync_b_acting =false
static
uint16_t usb_stream_resync_last_room =0
static
int16_t usb_stream_resync_ppm =0
static
t_cpu_time usb_stream_resync_timer