我正在尝试.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()
它时是否以某种方式修改了字符串,而不是它作为字符串输出到控制台的方式。