No more alert for EEPROM overflow

Trims buttons don't modify trim position on release
[ersky9x] Audio stopped sometimes without reason
This commit is contained in:
bsongis
2012-07-10 13:37:55 +00:00
parent dba6841815
commit fa4e1e4fc0
10 changed files with 254 additions and 164 deletions
+151 -122
View File
@@ -157,7 +157,7 @@ extern uint16_t Sine_values[];
#define CODEC_ID_PCM_S16LE 1
#define CODEC_ID_PCM_ALAW 6
uint8_t pcmCodec;
uint16_t pcmFreq = 8000;
uint32_t pcmFreq = 8000;
void audioTask(void* pdata)
{
@@ -183,119 +183,128 @@ void AudioQueue::wakeup()
#endif
if (prioIdx >= 0) {
ridx = prioIdx;
prioIdx = -1;
toneStop();
nextAudioData = NULL;
memset(&current, 0, sizeof(current));
if (state == AUDIO_PLAYING_WAV) {
state = AUDIO_RESUMING;
CoSetTmrCnt(audioTimer, 5/*10ms*/ + (WAV_BUFFER_SIZE * 1000) / pcmFreq, 0);
CoStartTmr(audioTimer);
}
else if (state == AUDIO_PLAYING_TONE) {
state = AUDIO_RESUMING;
CoSetTmrCnt(audioTimer, 5/*10ms*/, 0);
CoStartTmr(audioTimer);
}
else {
CoSetFlag(audioFlag);
}
background.duration = 0;
}
#if defined(SDCARD) && !defined(SIMU)
else if (current.file[0]) {
FRESULT result = FR_OK;
UINT read = 0;
if (current.file[1]) {
pcmFreq = 8000;
wavSamplesBuffer = wavSamplesArray;
result = f_open(&wavFile, current.file, FA_OPEN_EXISTING | FA_READ);
if (result == FR_OK) {
result = f_read(&wavFile, (uint8_t *)wavSamplesArray, WAV_HEADER_SIZE, &read);
if (result == FR_OK && read == WAV_HEADER_SIZE && !memcmp(wavSamplesArray, "RIFF", 4)) {
pcmCodec = wavSamplesArray[10];
pcmFreq = wavSamplesArray[12];
if (pcmCodec != CODEC_ID_PCM_S16LE) {
result = f_read(&wavFile, (uint8_t *)wavSamplesArray, 12, &read);
if (current.file[0]) {
if (!nextAudioData || DACC->DACC_ISR & DACC_ISR_TXBUFE) {
FRESULT result = FR_OK;
UINT read = 0;
if (current.file[1]) {
result = f_open(&wavFile, current.file, FA_OPEN_EXISTING | FA_READ);
current.file[1] = 0;
if (result == FR_OK) {
result = f_read(&wavFile, (uint8_t *) wavSamplesBuffer,
WAV_HEADER_SIZE, &read);
if (result == FR_OK && read == WAV_HEADER_SIZE
&& !memcmp(wavSamplesBuffer, "RIFF", 4)) {
pcmCodec = wavSamplesBuffer[10];
pcmFreq = wavSamplesBuffer[12];
if (pcmCodec != CODEC_ID_PCM_S16LE) {
result = f_read(&wavFile, (uint8_t *) wavSamplesBuffer, 12,
&read);
}
setFrequency(pcmFreq);
}
else {
result = FR_DENIED;
}
}
}
read = 0;
uint16_t bufsize = (pcmCodec == CODEC_ID_PCM_S16LE ? WAV_BUFFER_SIZE * sizeof(uint16_t) : WAV_BUFFER_SIZE);
if (result == FR_OK) {
result = f_read(&wavFile, (uint8_t *) wavSamplesBuffer, bufsize, &read);
}
if (result != FR_OK) {
toneStop();
current.file[0] = 0;
f_close(&wavFile);
CoSetTmrCnt(audioTimer, (WAV_BUFFER_SIZE * 1000) / pcmFreq, 0);
CoClearFlag(audioFlag);
CoStartTmr(audioTimer);
state = AUDIO_RESUMING;
}
else {
if (read != bufsize) {
current.file[0] = 0;
f_close(&wavFile);
}
if (pcmCodec == CODEC_ID_PCM_S16LE) {
read /= 2;
uint32_t i = 0;
for (; i < read; i++)
wavSamplesBuffer[i] = ((uint16_t) 0x8000 + ((int16_t) (wavSamplesBuffer[i]))) >> 4;
for (; i < WAV_BUFFER_SIZE; i++)
wavSamplesBuffer[i] = 0x8000;
}
else if (pcmCodec == CODEC_ID_PCM_ALAW) {
int32_t i;
for (i = read - 1; i >= 0; i--)
wavSamplesBuffer[i] = alawTable[((uint8_t *) wavSamplesBuffer)[i]];
for (i = read; i < WAV_BUFFER_SIZE; i++)
wavSamplesBuffer[i] = 0x8000;
}
read /= 2;
register Dacc *dacptr = DACC;
if (read) {
state = AUDIO_PLAYING_WAV;
if (dacptr->DACC_ISR & DACC_ISR_TXBUFE) {
dacptr->DACC_TPR = CONVERT_PTR(wavSamplesBuffer);
dacptr->DACC_TCR = read;
nextAudioData = NULL; // TODO possible?
CoSetFlag(audioFlag);
}
else if (dacptr->DACC_TNCR == 0) {
dacptr->DACC_TNPR = CONVERT_PTR(wavSamplesBuffer);
dacptr->DACC_TNCR = read;
nextAudioData = NULL; // TODO possible?
CoSetFlag(audioFlag);
}
else {
nextAudioSize = read;
nextAudioData = wavSamplesBuffer;
toneStart();
CoSetTmrCnt(audioTimer, (WAV_BUFFER_SIZE * 500) / pcmFreq, 0);
CoStartTmr(audioTimer);
}
wavSamplesBuffer += WAV_BUFFER_SIZE;
if (wavSamplesBuffer >= wavSamplesArray + 3 * WAV_BUFFER_SIZE)
wavSamplesBuffer = wavSamplesArray;
}
else {
result = FR_DENIED;
state = AUDIO_SLEEPING;
toneStop();
CoSetFlag(audioFlag);
}
}
}
else {
wavSamplesBuffer += WAV_BUFFER_SIZE;
if (wavSamplesBuffer >= wavSamplesArray + 3*WAV_BUFFER_SIZE)
wavSamplesBuffer = wavSamplesArray;
}
read = 0;
uint16_t bufsize = (pcmCodec == CODEC_ID_PCM_S16LE ? WAV_BUFFER_SIZE*sizeof(uint16_t) : WAV_BUFFER_SIZE);
if (result != FR_OK || f_read(&wavFile, (uint8_t *)wavSamplesBuffer, bufsize, &read) != FR_OK || read == 0) {
toneStop();
current.file[0] = 0;
current.file[1] = 0;
f_close(&wavFile);
CoSetTmrCnt(audioTimer, (WAV_BUFFER_SIZE * 1000) / pcmFreq, 0);
CoSetTmrCnt(audioTimer, 5/*10ms*/, 0);
CoStartTmr(audioTimer);
}
if (pcmCodec == CODEC_ID_PCM_S16LE) {
read /= 2;
uint32_t i = 0;
for (; i<read; i++)
wavSamplesBuffer[i] = ((uint16_t)0x8000 + ((int16_t)(wavSamplesBuffer[i]))) >> 4;
for (; i<WAV_BUFFER_SIZE; i++)
wavSamplesBuffer[i] = 0x8000;
}
else if (pcmCodec == CODEC_ID_PCM_ALAW) {
int32_t i;
for (i=read-1; i>=0; i--)
wavSamplesBuffer[i] = alawTable[((uint8_t *)wavSamplesBuffer)[i]];
for (i=read; i<WAV_BUFFER_SIZE; i++)
wavSamplesBuffer[i] = 0x8000;
}
read /= 2;
register Dacc *dacptr = DACC;
if (current.file[1]) {
state = AUDIO_PLAYING_WAV;
setFrequency(pcmFreq);
dacptr->DACC_TPR = CONVERT_PTR(wavSamplesBuffer);
dacptr->DACC_TCR = read;
current.file[1] = 0;
CoSetFlag(audioFlag);
}
else if (read) {
if (dacptr->DACC_TNCR == 0) {
dacptr->DACC_TNPR = CONVERT_PTR(wavSamplesBuffer);
dacptr->DACC_TNCR = read;
CoSetFlag(audioFlag);
}
else {
nextAudioSize = read;
nextAudioData = wavSamplesBuffer;
toneStart();
}
}
}
else
#endif
else if (current.duration > 0) {
if (state != AUDIO_PLAYING_TONE) {
state = AUDIO_PLAYING_TONE;
register Dacc *dacptr = DACC;
dacptr->DACC_TPR = CONVERT_PTR(Sine_values);
dacptr->DACC_TNPR = CONVERT_PTR(Sine_values);
dacptr->DACC_TCR = 50 ; // words, 100 16 bit values
dacptr->DACC_TNCR = 50 ; // words, 100 16 bit values
}
if (current.duration > 0) {
state = AUDIO_PLAYING_TONE;
register Dacc *dacptr = DACC;
dacptr->DACC_TPR = CONVERT_PTR(Sine_values);
dacptr->DACC_TNPR = CONVERT_PTR(Sine_values);
dacptr->DACC_TCR = 50 ; // words, 100 16 bit values
dacptr->DACC_TNCR = 50 ; // words, 100 16 bit values
setFrequency(current.freq * 6100 / 2);
if (current.freqIncr) {
CoSetTmrCnt(audioTimer, 5/*10ms*/, 0);
CoSetTmrCnt(audioTimer, 2, 0);
current.freq += current.freqIncr;
current.duration--;
}
@@ -304,6 +313,7 @@ void AudioQueue::wakeup()
current.duration = 0;
}
toneStart();
CoClearFlag(audioFlag);
CoStartTmr(audioTimer);
}
else if (current.pause > 0) {
@@ -311,16 +321,10 @@ void AudioQueue::wakeup()
CoSetTmrCnt(audioTimer, current.pause*2, 0);
current.pause = 0;
toneStop();
CoClearFlag(audioFlag);
CoStartTmr(audioTimer);
}
else if (ridx != widx) {
memcpy(&current, &fragments[ridx], sizeof(current));
if (!fragments[ridx].repeat--) {
ridx = (ridx + 1) % AUDIO_QUEUE_LENGTH;
}
CoSetFlag(audioFlag);
}
else if (background.duration > 0) {
else if (ridx == widx && prioIdx < 0 && background.duration > 0) {
if (state != AUDIO_PLAYING_TONE) {
state = AUDIO_PLAYING_TONE;
register Dacc *dacptr = DACC;
@@ -333,17 +337,49 @@ void AudioQueue::wakeup()
background.duration = 0;
setFrequency(background.freq * 6100 / 2);
toneStart();
CoClearFlag(audioFlag);
CoStartTmr(audioTimer);
}
else {
#ifndef SIMU
CoEnterMutexSection(audioMutex);
#endif
state = AUDIO_SLEEPING;
#ifndef SIMU
if (ridx != widx) {
if (prioIdx >= 0) {
ridx = prioIdx;
prioIdx = -1;
toneStop();
CoClearFlag(audioFlag);
nextAudioData = NULL;
memset(&current, 0, sizeof(current));
if (state == AUDIO_PLAYING_WAV) {
state = AUDIO_RESUMING;
CoSetTmrCnt(audioTimer, 1/*2ms*/ + (WAV_BUFFER_SIZE * 1000) / pcmFreq, 0);
CoStartTmr(audioTimer);
}
else if (state == AUDIO_PLAYING_TONE) {
state = AUDIO_RESUMING;
CoSetTmrCnt(audioTimer, 1/*2ms*/, 0);
CoStartTmr(audioTimer);
}
else {
CoSetFlag(audioFlag);
}
}
else {
CoSetFlag(audioFlag);
}
memcpy(&current, &fragments[ridx], sizeof(current));
if (!fragments[ridx].repeat--) {
ridx = (ridx + 1) % AUDIO_QUEUE_LENGTH;
}
}
else {
state = AUDIO_SLEEPING;
toneStop();
}
CoLeaveMutexSection(audioMutex);
#endif
toneStop();
}
}
@@ -370,9 +406,7 @@ extern OS_MutexID audioMutex;
void AudioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlags, int8_t tFreqIncr)
{
#ifndef SIMU
CoEnterMutexSection(audioMutex);
#endif
if (tFlags & PLAY_SOUND_VARIO) {
background.freq = tFreq;
@@ -408,19 +442,17 @@ void AudioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlag
}
}
#ifndef SIMU
CoLeaveMutexSection(audioMutex);
#endif
}
void AudioQueue::playFile(const char *filename, uint8_t flags)
{
#ifdef SIMU
printf("playFile(\"%s\"\n", filename); fflush(stdout);
#else
CoEnterMutexSection(audioMutex);
printf("playFile(\"%s\")\n", filename); fflush(stdout);
#endif
CoEnterMutexSection(audioMutex);
uint8_t next_widx = (widx + 1) % AUDIO_QUEUE_LENGTH;
if (next_widx != ridx) {
AudioFragment & fragment = fragments[widx];
@@ -436,9 +468,7 @@ void AudioQueue::playFile(const char *filename, uint8_t flags)
}
}
#ifndef SIMU
CoLeaveMutexSection(audioMutex);
#endif
}
void audioEvent(uint8_t e, uint8_t f)
@@ -640,5 +670,4 @@ void pushPrompt(uint16_t prompt)
audioQueue.playFile(filename);
#endif
}
+13 -15
View File
@@ -37,22 +37,22 @@
volatile uint8_t Buzzer_count ;
// Must NOT be in flash, PDC needs a RAM source.
// Amplitude reduced to 30% to allow for voice volume
uint16_t Sine_values[] =
{
2048,2173,2298,2422,2545,2666,2784,2899,3011,3119,
3223,3322,3417,3505,3589,3666,3736,3800,3857,3907,
3950,3985,4012,4032,4044,4048,4044,4032,4012,3985,
3950,3907,3857,3800,3736,3666,3589,3505,3417,3322,
3223,3119,3011,2899,2784,2666,2545,2422,2298,2173,
2048,1922,1797,1673,1550,1429,1311,1196,1084, 976,
872, 773, 678, 590, 506, 429, 359, 295, 238, 188,
145, 110, 83, 63, 51, 48, 51, 63, 83, 110,
145, 188, 238, 295, 359, 429, 506, 590, 678, 773,
872, 976,1084,1196,1311,1429,1550,1673,1797,1922
} ;
2048,2085,2123,2160,2197,2233,2268,2303,2336,2369,
2400,2430,2458,2485,2510,2533,2554,2573,2590,2605,
2618,2629,2637,2643,2646,2648,2646,2643,2637,2629,
2618,2605,2590,2573,2554,2533,2510,2485,2458,2430,
2400,2369,2336,2303,2268,2233,2197,2160,2123,2085,
2048,2010,1972,1935,1898,1862,1826,1792,1758,1726,
1695,1665,1637,1610,1585,1562,1541,1522,1505,1490,
1477,1466,1458,1452,1448,1448,1448,1452,1458,1466,
1477,1490,1505,1522,1541,1562,1585,1610,1637,1665,
1695,1726,1758,1792,1826,1862,1898,1935,1972,2010
};
// Sound routines
void startSound()
{
register Pio *pioptr ;
@@ -179,9 +179,6 @@ extern "C" void DAC_IRQHandler()
DACC->DACC_TNPR = CONVERT_PTR(nextAudioData);
DACC->DACC_TNCR = nextAudioSize;
nextAudioData = NULL;
CoEnterISR(); // Enter the interrupt
CoSetFlag(audioFlag);
CoExitISR(); // Exit the interrupt
}
else {
toneStop();
@@ -196,6 +193,7 @@ extern "C" void DAC_IRQHandler()
void end_sound()
{
DACC->DACC_IDR = DACC_IDR_ENDTX ;
DACC->DACC_IDR = DACC_IDR_TXBUFE ;
NVIC_DisableIRQ(DACC_IRQn) ;
TWI0->TWI_IDR = TWI_IDR_TXCOMP ;
NVIC_DisableIRQ(TWI0_IRQn) ;