1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
30
31
32
33
34
38
41
42
43
48
59
60
65
66
67
68
69
70
71
72
73
74
81
82
83
84
89
90
91
92
93
94
95
96
97
98
104
105
106
107
108
109
110
111
112
113
118
119
120
121
122
123
124
125
126
127
132
133
134
135
138
139
140
141
142
143
148
149
150
151
152
153
154
159
160
161
162
168
169
174
183
184
189
/* ... */
#include "audio_if.h"
/* ... */
/* ... */
Includes
static AUDIO_BufferTypeDef buffer_ctl;
static AUDIO_PLAYBACK_StateTypeDef audio_state;
Private variables
static uint32_t GetData(void *pdata, uint32_t offset, uint8_t *pbuf, uint32_t NbrOfData);
Private function prototypes
/* ... */
AUDIO_ErrorTypeDef AUDIO_Init(void)
{
audio_state = AUDIO_STATE_IDLE;
if(BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_AUTO, AUDIO_DEFAULT_VOLUME, SAI_AUDIO_FREQUENCY_48K) == 0)
{
audio_state = AUDIO_STATE_INIT;
return AUDIO_ERROR_NONE;
}if (BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_AUTO, AUDIO_DEFAULT_VOLUME, SAI_AUDIO_FREQUENCY_48K) == 0) { ... }
return AUDIO_ERROR_IO;
}{ ... }
/* ... */
AUDIO_ErrorTypeDef AUDIO_Start(void)
{
uint32_t bytesread;
buffer_ctl.state = BUFFER_OFFSET_NONE;
bytesread = GetData( (void *)AUDIO_FILE_ADDRESS,
0,
&buffer_ctl.buff[0],
AUDIO_BUFFER_SIZE);
if(bytesread > 0)
{
BSP_AUDIO_OUT_Play((uint16_t*)&buffer_ctl.buff[0], AUDIO_BUFFER_SIZE);
audio_state = AUDIO_STATE_PLAYING;
buffer_ctl.fptr = bytesread;
return AUDIO_ERROR_NONE;
}if (bytesread > 0) { ... }
return AUDIO_ERROR_IO;
}{ ... }
/* ... */
AUDIO_ErrorTypeDef AUDIO_Process(void)
{
uint32_t bytesread;
AUDIO_ErrorTypeDef error_state = AUDIO_ERROR_NONE;
switch(audio_state)
{
case AUDIO_STATE_PLAYING:
if(buffer_ctl.fptr >= AUDIO_FILE_SIZE)
{
buffer_ctl.fptr = 0;
error_state = AUDIO_ERROR_EOF;
}if (buffer_ctl.fptr >= AUDIO_FILE_SIZE) { ... }
if(buffer_ctl.state == BUFFER_OFFSET_HALF)
{
bytesread = GetData((void *)AUDIO_FILE_ADDRESS,
buffer_ctl.fptr,
&buffer_ctl.buff[0],
AUDIO_BUFFER_SIZE /2);
if( bytesread >0)
{
buffer_ctl.state = BUFFER_OFFSET_NONE;
buffer_ctl.fptr += bytesread;
}if (bytesread >0) { ... }
}if (buffer_ctl.state == BUFFER_OFFSET_HALF) { ... }
if(buffer_ctl.state == BUFFER_OFFSET_FULL)
{
bytesread = GetData((void *)AUDIO_FILE_ADDRESS,
buffer_ctl.fptr,
&buffer_ctl.buff[AUDIO_BUFFER_SIZE /2],
AUDIO_BUFFER_SIZE /2);
if( bytesread > 0)
{
buffer_ctl.state = BUFFER_OFFSET_NONE;
buffer_ctl.fptr += bytesread;
}if (bytesread > 0) { ... }
}if (buffer_ctl.state == BUFFER_OFFSET_FULL) { ... }
break;
case AUDIO_STATE_PLAYING:
default:
error_state = AUDIO_ERROR_NOTREADY;
break;default
}switch (audio_state) { ... }
return error_state;
}{ ... }
/* ... */
static uint32_t GetData(void *pdata, uint32_t offset, uint8_t *pbuf, uint32_t NbrOfData)
{
uint8_t *lptr = pdata;
uint32_t ReadDataNbr;
ReadDataNbr = 0;
while(((offset + ReadDataNbr) < AUDIO_FILE_SIZE) && (ReadDataNbr < NbrOfData))
{
pbuf[ReadDataNbr]= lptr [offset + ReadDataNbr];
ReadDataNbr++;
}while (((offset + ReadDataNbr) < AUDIO_FILE_SIZE) && (ReadDataNbr < NbrOfData)) { ... }
return ReadDataNbr;
}{ ... }
/* ... */
/* ... */
void BSP_AUDIO_OUT_TransferComplete_CallBack(void)
{
if(audio_state == AUDIO_STATE_PLAYING)
{
buffer_ctl.state = BUFFER_OFFSET_FULL;
}if (audio_state == AUDIO_STATE_PLAYING) { ... }
}{ ... }
/* ... */
void BSP_AUDIO_OUT_HalfTransfer_CallBack(void)
{
if(audio_state == AUDIO_STATE_PLAYING)
{
buffer_ctl.state = BUFFER_OFFSET_HALF;
}if (audio_state == AUDIO_STATE_PLAYING) { ... }
}{ ... }