1

我正在尝试.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 数据分配给文件时,这是在传递.wavint 的函数内部: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()它时是否以某种方式修改了字符串,而不是它作为字符串输出到控制台的方式。

4

1 回答 1

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

感谢所有提供帮助的人!

于 2018-05-14T22:36:20.527 回答