Я пытаюсь воспроизвести определенные .wav
файлы на основе значения int
. В настоящее время моя программа прекрасно работает с .wav
файлами, и я могу воспроизводить их вручную. Я храню расположение файлов .wav
в элементе char[]
в структуре под названием sInt
:
extern struct sInt {
int value;
enum Color color;
char fileName[250];
};
Таким образом, частота файла .wav
- это просто константа, умноженная на член value
в sInt
. В настоящее время у меня есть массив struct sInt
, называемый arr
, и я перебираю массив, вызывая все .wav
файлы, например:
PlaySound(arr[j].fileName, NULL, SND_FILENAME | SND_SYNC);
printf("%s \n", arr[j].fileName);
Но я слышу только звуковой сигнал по умолчанию, а не файл .wav
.
Я вручную перешел к файлу .wav
, чтобы убедиться, что в нем есть звук и он есть.
Я добавил оператор printf
, чтобы посмотреть, как я храню имена файлов, и получаю этот вывод.
D:\Documents - Data Drive\waveFiles\freq2.wav
Вместе с другими местоположениями файлов, но там все тоже самое, кроме номера в конце. Поэтому я скопировал этот вывод printf
в мой код следующим образом:
PlaySound(TEXT("D:\\Documents - Data Drive\\waveFiles\\freq2.wav"), NULL, SND_FILENAME | SND_ASYNC);
И это прекрасно работает.
Не понимаю, почему это не сработает, когда я звоню arr[j].fileName
.
Я не уверен, что, может быть, мне следует передать местоположение имени файла другим способом, но у меня есть около 1000 .wav
файлов, которые мне нужно вызывать свободно, поэтому я не уверен, есть ли лучший способ сделать это. Любая помощь будет оценена спасибо заранее.
--------- EDIT ----------
Вот когда я присваиваю wav-данные файлу .wav
, это внутри функции, где передается int i
:
char fileName[250] = "D:\\Documents - Data Drive\\waveFiles\\";
char helpMe[50];
//Generate new file name for specified i;
sprintf_s(helpMe, 32, "freq%d.wav", i);
printf("helpMe = %s \n", helpMe);
//Add new file name to location string
strcat_s(fileName, 200, helpMe);
printf("FileName = %s \n", fileName);
//write wave to wavefile
waveToFile(&mySound, fileName);
array[i].help = i;
printf("done \n");
//free up mem from wav
waveDestroy(&mySound);
//add fileName to sInt fileName
strcpy_s(array[i].fileName, 250, fileName);
printf("FIlename in sInt = %s \n", array[i].fileName);
Вот код, где я на самом деле создаю файл .wav
при вызове wavToFile()
:
void waveToFile(struct Wave* wave, const char* filename) {
// First make sure all numbers are little endian
toLittleEndian(sizeof(int), (void*)&(wave->header.chunkSize));
toLittleEndian(sizeof(int), (void*)&(wave->header.subChunk1Size));
toLittleEndian(sizeof(short int), (void*)&(wave->header.audioFormat));
toLittleEndian(sizeof(short int), (void*)&(wave->header.numChannels));
toLittleEndian(sizeof(int), (void*)&(wave->header.sampleRate));
toLittleEndian(sizeof(int), (void*)&(wave->header.byteRate));
toLittleEndian(sizeof(short int), (void*)&(wave->header.blockAlign));
toLittleEndian(sizeof(short int), (void*)&(wave->header.bitsPerSample));
toLittleEndian(sizeof(int), (void*)&(wave->header.subChunk2Size));
// Open the file, write header, write data
FILE *file;
fopen_s(&file, filename, "wb");
fwrite(&(wave->header), sizeof(struct WaveHeader), 1, file);
fwrite((void*)(wave->data), sizeof(char), wave->size, file);
fclose(file);
// Convert back to system endian-ness
toLittleEndian(sizeof(int), (void*)&(wave->header.chunkSize));
toLittleEndian(sizeof(int), (void*)&(wave->header.subChunk1Size));
toLittleEndian(sizeof(short int), (void*)&(wave->header.audioFormat));
toLittleEndian(sizeof(short int), (void*)&(wave->header.numChannels));
toLittleEndian(sizeof(int), (void*)&(wave->header.sampleRate));
toLittleEndian(sizeof(int), (void*)&(wave->header.byteRate));
toLittleEndian(sizeof(short int), (void*)&(wave->header.blockAlign));
toLittleEndian(sizeof(short int), (void*)&(wave->header.bitsPerSample));
toLittleEndian(sizeof(int), (void*)&(wave->header.subChunk2Size));
}
Я точно знаю, что файлы .wav
создаются, поскольку я могу напрямую перейти в эту папку, открыть файлы вручную и воспроизвести звук.
---------- РЕДАКТИРОВАТЬ 2 --------
Поэтому я изменил оператор printf
после вызова PlaySound()
, чтобы помочь увидеть, что передается в PlaySound()
, когда я использую arr[i].fileName
:
PlaySound(array[j].fileName, NULL, SND_FILENAME | SND_SYNC);
printf("\"%s\"< \n", array[j].fileName);
А вот Точный вывод:
"D:\Documents - Data Drive\waveFiles\freq2.wav"<
"D:\Documents - Data Drive\waveFiles\freq3.wav"<
"D:\Documents - Data Drive\waveFiles\freq4.wav"<
Я хотел бы повторить, если я скопирую этот точный вывод в PlaySound()
следующим образом:
PlaySound(TEXT("D:\\Documents - Data Drive\\waveFiles\\freq2.wav"), NULL, SND_FILENAME | SND_SYNC);
Файл .wav
воспроизводится. Поэтому я не уверен, что при передаче char[]
в PlaySound()
это каким-то образом изменяет строку иначе, чем при выводе в виде строки на консоль.