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*.

Спасибо всем, кто выручил!

Другие вопросы по тегам