Хорошо. Вот так я читаю заголовок. Изменений никаких. В посте выше я просто переместил указатель на 44 байта.
CODE
static
DWORD load_header (void) /* 0:Invalid format, 1:I/O error, >1:Number of samples */
{
DWORD ChunkID, SamplingRate, sz, Length;
char str[20];
//------------------------------------------------
f_mount(0,&fs);
f_open( &fsrc, "200.wav", FA_READ );
//------------------------------------------------
GUI_SetColor(GUI_WHITE); //RED
GUI_SetFont(&GUI_Font24_1);
GUI_DispStringAt(">", 0, 50);
if (f_read(&fsrc, Buff, 12, &rb)) return 1; /* Load file header (12 bytes) */
if (rb != 12 || LD_DWORD(Buff+8) != FCC('W','A','V','E')) return 0;
GUI_DispNextLine(); GUI_DispString("WAV File found:");
while(1) {
f_read(&fsrc, Buff, 8, &rb); /* Get Chunk ID and size */
if (rb != 8) return 0;
ChunkID = LD_DWORD(&Buff[0]);
sz = LD_DWORD(&Buff[4]); /* Chunk size */
//------------------------------
sprintf(str, "%ld", sz);
GUI_DispNextLine();
GUI_DispString(str);
//------------------------------
switch (ChunkID) { /* FCC */
case fmt_chunk: /* 'fmt ' chunk */
if (sz > 100 || sz < 16) return 0; /* Check chunk size */
f_read(&fsrc, Buff, sz, &rb); /* Get content */
if (rb != sz) return 0;
if (Buff[0] != 1) return 0; /* Check coding type (PCM=1) */
NumChannels = Buff[2]; /* Get channel flag */
if (NumChannels != 1 && NumChannels != 2) /* Check channels (1/2) */
return 0;
if(NumChannels == 1) {GUI_DispNextLine(); GUI_DispString("Mono");}
else if(NumChannels == 2) {GUI_DispNextLine(); GUI_DispString("Stereo");}
BitsPerSample = Buff[14]; /* Resolution flag */
if (BitsPerSample != 8 && BitsPerSample != 16) /* Check resolution (8/16) */
return 0;
if(BitsPerSample == 8) {GUI_DispNextLine(); GUI_DispString("8-bits");}
else if(BitsPerSample == 16) {GUI_DispNextLine(); GUI_DispString("16-bits");}
SamplingRate = LD_DWORD(Buff+4);
// set_sampling_rate( SamplingRate ); /* Sampling freq */
sprintf(str, "%ldHz", SamplingRate);
GUI_DispNextLine(); GUI_DispString(str);
break;
case data_chunk: /* 'data' chunk (start to play) */
Length = sz / (SamplingRate * NumChannels * (BitsPerSample>>3) ); // length in seconds
sprintf(str, "%ld:%2ld min", (Length/60), (Length%60));
GUI_DispNextLine(); GUI_DispString(str);
return sz;
case LIST_chunk: /* 'LIST' chunk (skip) */
case fact_chunk: /* 'fact' chunk (skip) */
f_lseek(&fsrc, (fsrc.fptr + sz));
break;
default : /* Unknown chunk (error) */
return 0;
}
}
//return 0;
}
и дальше
Код
void sound(void)
{
f_read (&fsrc, &WAVBuffer[0], 512, &rb);
while(1)
{
while(!(DMA2->ISR & DMA_ISR_HTIF3)) {}
f_read (&fsrc, &WAVBuffer[0], 256, &rb);
DMA2->IFCR |= DMA_ISR_HTIF3;
if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}
while(!(DMA2->ISR & DMA_ISR_TCIF3)) {}
f_read (&fsrc, &WAVBuffer[256], 256, &rb);
DMA2->IFCR |= DMA_ISR_HTIF3;
if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}
}
}
Исправил
while(1)
{
while(!(DMA2->ISR & DMA_ISR_HTIF3)) {}
f_read (&fsrc, &WAVBuffer[0], 256, &rb);
DMA2->IFCR |= DMA_ISR_HTIF3;
if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}
while(!(DMA2->ISR & DMA_ISR_TCIF3)) {}
f_read (&fsrc, &WAVBuffer[256], 256, &rb);
DMA2->IFCR |= DMA_ISR_TCIF3; //
if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}
}
Все равно на экране беспорядочные значения
Сообщение отредактировал loreal1970 - Apr 30 2015, 10:38
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!