1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
32
33
34
35
36
42
45
46
47
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
74
78
79
84
88
89
95
107
108
113
114
115
116
117
118
119
132
133
134
135
136
141
142
143
144
145
149
153
157
158
159
161
162
163
164
165
170
171
172
173
174
175
176
177
178
179
180
181
186
187
188
189
190
191
192
193
194
195
196
197
202
208
209
210
215
221
226
227
228
229
230
231
232
233
234
235
236
237
238
239
245
251
252
258
259
260
261
262
263
264
276
277
278
279
284
294
295
300
304
305
310
318
319
324
332
333
338
342
343
348
404
405
408
409
/* ... */
#include "audioplayer_app.h"
#include "stm324x9i_eval_audio.h"
/* ... */
/* ... */
Includes
static FIL wav_file;
static AUDIOPLAYER_ProcessTypdef haudio;
static osMessageQId AudioEvent;
static osThreadId AudioThreadId = 0;
Private variables
static void Audio_Thread(void const * argument);
Private function prototypes
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_Init(void)
{
haudio.state = AUDIOPLAYER_STOP;
haudio.mute = MUTE_OFF;
haudio.volume = AUDIO_DEFAULT_VOLUME;
osMessageQDef(AUDIO_Queue, 1, uint16_t);
AudioEvent = osMessageCreate (osMessageQ(AUDIO_Queue), NULL);
osThreadDef(osAudio_Thread, Audio_Thread, osPriorityHigh, 0, 512);
AudioThreadId = osThreadCreate (osThread(osAudio_Thread), NULL);
return AUDIOPLAYER_ERROR_NONE;
}{ ... }
/* ... */
AUDIOPLAYER_StateTypdef AUDIOPLAYER_GetState(void)
{
return haudio.state;
}{ ... }
/* ... */
uint32_t AUDIOPLAYER_GetVolume(void)
{
return haudio.volume;
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_SetVolume(uint32_t volume)
{
if(BSP_AUDIO_OUT_SetVolume(volume) == AUDIO_OK)
{
haudio.volume = volume;
return AUDIOPLAYER_ERROR_NONE;
}if (BSP_AUDIO_OUT_SetVolume(volume) == AUDIO_OK) { ... }
else
{
return AUDIOPLAYER_ERROR_HW;
}else { ... }
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_Play(uint32_t frequency)
{
uint32_t numOfReadBytes;
haudio.state = AUDIOPLAYER_PLAY;
if(f_read(&wav_file,
&haudio.buffer[0],
AUDIO_BUFFER_SIZE,
(void *)&numOfReadBytes) == FR_OK)
{
if(numOfReadBytes != 0)
{
BSP_AUDIO_OUT_SetFrequency(frequency);
osThreadResume(AudioThreadId);
BSP_AUDIO_OUT_Play((uint16_t*)&haudio.buffer[0], AUDIO_BUFFER_SIZE);
return AUDIOPLAYER_ERROR_NONE;
}if (numOfReadBytes != 0) { ... }
}if (f_read(&wav_file, &haudio.buffer[0], AUDIO_BUFFER_SIZE, (void *)&numOfReadBytes) == FR_OK) { ... }
return AUDIOPLAYER_ERROR_IO;
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_Process(void)
{
switch(haudio.state)
{
case AUDIOPLAYER_START:
haudio.state = AUDIOPLAYER_PLAY;
break;
case AUDIOPLAYER_START:
case AUDIOPLAYER_EOF:
AUDIOPLAYER_NotifyEndOfFile();
break;
case AUDIOPLAYER_EOF:
case AUDIOPLAYER_ERROR:
AUDIOPLAYER_Stop();
break;
case AUDIOPLAYER_ERROR:
case AUDIOPLAYER_STOP:
case AUDIOPLAYER_PLAY:
default:
break;default
}switch (haudio.state) { ... }
return AUDIOPLAYER_ERROR_NONE;
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_DeInit(void)
{
f_close(&wav_file);
haudio.state = AUDIOPLAYER_STOP;
BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW);
vQueueDelete(AudioEvent);
osThreadTerminate(AudioThreadId);
return AUDIOPLAYER_ERROR_NONE;
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_Stop(void)
{
f_close(&wav_file);
osThreadSuspend(AudioThreadId);
BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW);
haudio.state = AUDIOPLAYER_STOP;
return AUDIOPLAYER_ERROR_NONE;
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_Pause(void)
{
osThreadSuspend(AudioThreadId);
BSP_AUDIO_OUT_Pause();
return AUDIOPLAYER_ERROR_NONE;
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_Resume(void)
{
osThreadResume(AudioThreadId);
BSP_AUDIO_OUT_Resume();
return AUDIOPLAYER_ERROR_NONE;
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_SetPosition(uint32_t position)
{
long file_pos;
file_pos = f_size(&wav_file) / AUDIO_BUFFER_SIZE / 100;
file_pos *= (position * AUDIO_BUFFER_SIZE);
BSP_AUDIO_OUT_Pause();
f_lseek(&wav_file, file_pos);
BSP_AUDIO_OUT_Resume();
return AUDIOPLAYER_ERROR_NONE;
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_Mute(uint8_t state)
{
BSP_AUDIO_OUT_SetMute(state);
return AUDIOPLAYER_ERROR_NONE;
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_GetFileInfo(char* file, WAV_InfoTypedef* info)
{
uint32_t numOfReadBytes;
AUDIOPLAYER_ErrorTypdef ret = AUDIOPLAYER_ERROR_IO;
FIL fsfile;
if( f_open(&fsfile, file, FA_OPEN_EXISTING | FA_READ) == FR_OK)
{
if(f_read(&fsfile, info, sizeof(WAV_InfoTypedef), (void *)&numOfReadBytes) == FR_OK)
{
if((info->ChunkID == 0x46464952) && (info->AudioFormat == 1))
{
ret = AUDIOPLAYER_ERROR_NONE;
}if ((info->ChunkID == 0x46464952) && (info->AudioFormat == 1)) { ... }
}if (f_read(&fsfile, info, sizeof(WAV_InfoTypedef), (void *)&numOfReadBytes) == FR_OK) { ... }
f_close(&fsfile);
}if (f_open(&fsfile, file, FA_OPEN_EXISTING | FA_READ) == FR_OK) { ... }
return ret;
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_SelectFile(char* file)
{
AUDIOPLAYER_ErrorTypdef ret = AUDIOPLAYER_ERROR_IO;
if( f_open(&wav_file, file, FA_OPEN_EXISTING | FA_READ) == FR_OK)
{
f_lseek(&wav_file, sizeof(WAV_InfoTypedef));
ret = AUDIOPLAYER_ERROR_NONE;
}if (f_open(&wav_file, file, FA_OPEN_EXISTING | FA_READ) == FR_OK) { ... }
return ret;
}{ ... }
/* ... */
uint32_t AUDIOPLAYER_GetProgress(void)
{
return (wav_file.fptr);
}{ ... }
/* ... */
void BSP_AUDIO_OUT_TransferComplete_CallBack(void)
{
if(haudio.state == AUDIOPLAYER_PLAY)
{
BSP_AUDIO_OUT_ChangeBuffer((uint16_t*)&haudio.buffer[0], AUDIO_BUFFER_SIZE /2);
osMessagePut ( AudioEvent, BUFFER_OFFSET_FULL, 0);
}if (haudio.state == AUDIOPLAYER_PLAY) { ... }
}{ ... }
/* ... */
void BSP_AUDIO_OUT_HalfTransfer_CallBack(void)
{
if(haudio.state == AUDIOPLAYER_PLAY)
{
BSP_AUDIO_OUT_ChangeBuffer((uint16_t*)&haudio.buffer[AUDIO_BUFFER_SIZE /2], AUDIO_BUFFER_SIZE /2);
osMessagePut ( AudioEvent, BUFFER_OFFSET_HALF, 0);
}if (haudio.state == AUDIOPLAYER_PLAY) { ... }
}{ ... }
/* ... */
void BSP_AUDIO_OUT_Error_CallBack(void)
{
haudio.state = AUDIOPLAYER_ERROR;
}{ ... }
/* ... */
static void Audio_Thread(void const * argument)
{
uint32_t numOfReadBytes;
osEvent event;
for(;;)
{
event = osMessageGet(AudioEvent, 100 );
if( event.status == osEventMessage )
{
if(haudio.state == AUDIOPLAYER_PLAY)
{
switch(event.value.v)
{
case BUFFER_OFFSET_HALF:
if(f_read(&wav_file,
&haudio.buffer[0],
AUDIO_BUFFER_SIZE/2,
(void *)&numOfReadBytes) == FR_OK)
{
if(numOfReadBytes == 0)
{
haudio.state = AUDIOPLAYER_EOF;
}if (numOfReadBytes == 0) { ... }
}if (f_read(&wav_file, &haudio.buffer[0], AUDIO_BUFFER_SIZE/2, (void *)&numOfReadBytes) == FR_OK) { ... }
else
{
haudio.state = AUDIOPLAYER_ERROR;
}else { ... }
break;
case BUFFER_OFFSET_HALF:
case BUFFER_OFFSET_FULL:
if(f_read(&wav_file,
&haudio.buffer[AUDIO_BUFFER_SIZE/2],
AUDIO_BUFFER_SIZE/2,
(void *)&numOfReadBytes) == FR_OK)
{
if(numOfReadBytes == 0)
{
haudio.state = AUDIOPLAYER_EOF;
}if (numOfReadBytes == 0) { ... }
}if (f_read(&wav_file, &haudio.buffer[AUDIO_BUFFER_SIZE/2], AUDIO_BUFFER_SIZE/2, (void *)&numOfReadBytes) == FR_OK) { ... }
else
{
haudio.state = AUDIOPLAYER_ERROR;
}else { ... }
break;
case BUFFER_OFFSET_FULL:
default:
break;default
}switch (event.value.v) { ... }
}if (haudio.state == AUDIOPLAYER_PLAY) { ... }
}if (event.status == osEventMessage) { ... }
}for (;;) { ... }
}{ ... }
/* ... */
/* ... */