C - PlaySound()在将位置作为char []传递时未找到文件

时间:2018-05-14 20:57:42

标签: c winapi playsound

我正在尝试根据.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个文件我需要自由调用,所以我不确定是否有一个更好的方法来做到这一点。任何帮助将不胜感激,谢谢你提前。

--------- ---------- 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);

以下是EXACT输出:

"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 :(得分: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 *。

谢谢所有帮助过的人!