C - PlaySound() не находит файл при передаче местоположения как char[]
Я пытаюсь играть наверняка .wav
файлы на основе int
значение. В настоящее время моя программа делает .wav
файлы в порядке, и я могу воспроизвести их вручную. Я храню местоположение .wav
файлы в char[]
член под структурой под названием sInt
:
extern struct sInt {
int value;
enum Color color;
char fileName[250];
};
Так что частота .wav
файл это просто константа, умноженная на value
член в sInt
, В настоящее время у меня есть массив структур 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
файлы, которые мне нужно вызывать свободно, поэтому я не уверен, есть ли лучший способ сделать это. Любая помощь будет оценена спасибо заранее.
---------РЕДАКТИРОВАТЬ----------
Вот когда я назначаю 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()
он каким-то образом изменяет строку, а не выводит ее в виде строки на консоль.
1 ответ
Ответьте благодаря @pstrjds. PlaySoundW
нужен wchar*
массив передан не char*
прошло.
Итак, вот изменения, которые я сделал:
extern struct sInt {
int value;
enum Color color;
wchar_t fileName[250];
int help;
};
И когда я копирую путь к файлу fileName
Я изменил строку:
strcpy_s(array[i].fileName, sizeof(array[i].fileName), fileName);
в
swprintf(array[i].fileName, sizeof(array[i].fileName), L"%hs", fileName);
конвертировать из char* в wchar_t*.
Спасибо всем, кто выручил!