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
70
75
79
80
85
89
90
96
108
109
114
115
116
117
118
119
120
133
134
135
136
137
142
143
144
145
146
150
154
158
159
160
162
163
164
165
166
171
172
173
174
175
176
177
178
179
180
181
182
183
188
189
190
191
192
193
194
195
196
197
198
199
200
201
206
212
213
214
219
225
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
250
256
257
263
264
265
266
267
268
269
281
282
283
284
289
299
300
305
309
310
315
323
324
329
337
338
343
347
348
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
377
378
389
394
395
396
397
398
399
400
401
406
407
418
423
424
425
427
428
429
430
431
432
433
434
435
436
437
438
441
442
/* ... */
#include "audioplayer_app.h"
#include "stm32446e_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, 4 * configMINIMAL_STACK_SIZE);
AudioThreadId = osThreadCreate (osThread(osAudio_Thread), NULL);
BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
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);
vQueueDelete(AudioEvent);
osThreadTerminate(AudioThreadId);
AUDIOPLAYER_Mute(1);
haudio.state = AUDIOPLAYER_STOP;
BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW);
return AUDIOPLAYER_ERROR_NONE;
}{ ... }
/* ... */
AUDIOPLAYER_ErrorTypdef AUDIOPLAYER_Stop(void)
{
AUDIOPLAYER_Mute(1);
BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW);
f_close(&wav_file);
osThreadSuspend(AudioThreadId);
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();
GUI_Delay(100);
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, remlen;
osEvent event;
for(;;)
{
event = osMessageGet(AudioEvent, 100 );
if( event.status == osEventMessage )
{
if(haudio.state == AUDIOPLAYER_PLAY)
{
switch(event.value.v)
{
case BUFFER_OFFSET_HALF:
remlen = f_size(&wav_file) - wav_file.fptr ;
if(remlen < AUDIO_BUFFER_SIZE/2 )
{
BSP_AUDIO_OUT_SetMute(1);
haudio.state = AUDIOPLAYER_EOF;
}if (remlen < AUDIO_BUFFER_SIZE/2) { ... }
if(f_read(&wav_file,
&haudio.buffer[0],
AUDIO_BUFFER_SIZE/2,
(void *)&numOfReadBytes) == FR_OK)
{
if(numOfReadBytes == 0)
{
BSP_AUDIO_OUT_SetMute(1);
haudio.state = AUDIOPLAYER_EOF;
}if (numOfReadBytes == 0) { ... }
}if (f_read(&wav_file, &haudio.buffer[0], AUDIO_BUFFER_SIZE/2, (void *)&numOfReadBytes) == FR_OK) { ... }
else
{
BSP_AUDIO_OUT_SetMute(1);
haudio.state = AUDIOPLAYER_ERROR;
}else { ... }
break;
case BUFFER_OFFSET_HALF:
case BUFFER_OFFSET_FULL:
remlen = f_size(&wav_file) - wav_file.fptr ;
if(remlen < AUDIO_BUFFER_SIZE/2 )
{
BSP_AUDIO_OUT_SetMute(1);
haudio.state = AUDIOPLAYER_EOF;
}if (remlen < AUDIO_BUFFER_SIZE/2) { ... }
if(f_read(&wav_file,
&haudio.buffer[AUDIO_BUFFER_SIZE/2],
AUDIO_BUFFER_SIZE/2,
(void *)&numOfReadBytes) == FR_OK)
{
if(numOfReadBytes == 0)
{
BSP_AUDIO_OUT_SetMute(1);
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
{
BSP_AUDIO_OUT_SetMute(1);
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 (;;) { ... }
}{ ... }
/* ... */
/* ... */