我正在尝试根据.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()
时,它是否以某种方式修改字符串的方式与将其作为字符串输出到控制台的方式不同。
答案 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 *。
谢谢所有帮助过的人!