C - PlaySound () не находит файл при передаче местоположения как char [] - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь воспроизвести определенные .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() это каким-то образом изменяет строку иначе, чем при выводе в виде строки на консоль.

1 Ответ

0 голосов
/ 15 мая 2018

Ответьте благодаря @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 *.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...