8 years, 5 months ago.

WAVファイル名を指定して再生したいのですが

GR-PEACH_Audio_WAV のメインルーチンをほとんどそのままサブルーチンに移植して、ファイル名指定でWAVを再生しようとしたのですが、2つ目以降が再生されません。簡単な方法はないでしょうか?

Question relating to:

This sample will play a ".wav" file of the USB root folder. Only RIFF format. audio, dac, GR-PEACH, USB

1 Answer

8 years, 5 months ago.

ファイルのパスが分かっている状態であれば、ディレクトリ操作「opendir()、readdir()、closedir()」を行う必要はありません。
fopen()で直接ファイルパスを指定してファイルをオープンしてください。使い終わったファイルはfclose()でクローズしてください。

Katoさん、ありがとうございます。 あまり理解できない状態でサブルーチン化しているのですが、 以下のような記述で再生できるようになりました。

void talk(char *talk_wav) { rbsp_data_conf_t audio_write_async_ctl = {&callback_audio_write_end, NULL}; FILE * fp = NULL; char file_path[sizeof(FLD_PATH) + FILE_NAME_LEN]; int buff_index = 0; size_t audio_data_size; dec_wav wav_file; strcpy(file_path, FLD_PATH); strcat(file_path, talk_wav); strcat(file_path, ".wav"); printf("talk %s\n",file_path); fp = fopen(file_path, "r"); if (wav_file.AnalyzeHeder(title_buf, artist_buf, album_buf,TEXT_SIZE, fp) == false) { fclose(fp); fp = NULL; } else if ((wav_file.GetChannel() != 2)

(audio.format(wav_file.GetBlockSize()) == false)
(audio.frequency(wav_file.GetSamplingRate()) == false)) {

printf("Error File :%s\n", talk_wav); printf("Audio Info :%dch, %dbit, %dHz\n", wav_file.GetChannel(),wav_file.GetBlockSize(), wav_file.GetSamplingRate()); printf("\n"); fclose(fp); fp = NULL; } else { printf("File :%s\n", talk_wav); printf("Audio Info :%dch, %dbit, %dHz\n", wav_file.GetChannel(),wav_file.GetBlockSize(), wav_file.GetSamplingRate()); printf("Title :%s\n", title_buf); printf("Artist :%s\n", artist_buf); printf("Album :%s\n", album_buf); printf("\n"); }

while(1) { file read uint8_t * p_buf = audio_write_buff[buff_index];

audio_data_size = wav_file.GetNextData(p_buf, AUDIO_WRITE_BUFF_SIZE); if (audio_data_size > 0) { audio.write(p_buf, audio_data_size, &audio_write_async_ctl); buff_index++; if (buff_index >= AUDIO_WRITE_BUFF_NUM) { buff_index = 0; } }

file close if ((audio_data_size < AUDIO_WRITE_BUFF_SIZE) || (button == 0)) { fclose(fp); fp = NULL; Thread::wait(500); return; } } }

posted by Hideshi Maeno 09 Nov 2015