我想使用此函数来调用PlaySoundA函数,但是我要播放的声音文件无法打开。
void AudioClass::playAudio(const char* incomingData, const char* filePath)
{
char buffer[100]; // <- danger, only storage for 100 characters.
strncpy_s(buffer, filePath, sizeof(buffer));
strncat_s(buffer, incomingData, sizeof(buffer));
PlaySoundA(buffer, NULL, SND_FILENAME);
}
如我所知,如果PlaySoundA()的LPCSTR pszSound参数的参数以字符串形式给出(例如“C:/Users/User/Documents/sound.wav”),即给出了文件的完整路径,声音会播放。
我想将传入数据参数(文件名)和filePath参数结合起来,为此我使用了缓冲区。
如果找不到该文件,则应播放默认的系统声音(在我的情况下是蜂鸣声),但情况不再如此。即使未设置SND_NODEFAULT标志,在这种情况下PlaySoundA()也会以静默方式返回,而不会播放默认的系统声音。
https://docs.microsoft.com/en-us/previous-versions/dd743680(v%3Dvs.85)
我尝试传递的参数是否可能与LPCSTR pszSound参数不兼容?
在运行调试器时,缓冲区变量似乎保留了整个路径(C:/Users/User/Documents/sound.wav \ r \ n),但是为什么末尾有一个\ r \ n前缀呢?
定义:
#define MAX_DATA_LENGTH 255
char incomingData[MAX_DATA_LENGTH];
const char* filePath {"C:/Users/User/Desktop/"};
//Arduino SerialPort object
SerialPort *arduino;
//Audio file AudioClass object
AudioClass* audio;
在这里调用playAudio():
void exampleReceiveData(void)
{
int readResult = arduino->SerialPort::readSerialPort(incomingData, MAX_DATA_LENGTH);
audio->AudioClass::playAudio(incomingData, filePath);
Sleep(10000);
}
EDIT_1:我使用的真实文件路径的长度小于100个字符。
EDIT_2:我收到此警告:字符串'buffer'可能不会以零结尾。
最佳答案
最后的\r\n
来自串行端口:https://www.arduino.cc/reference/en/language/functions/communication/serial/println
您可以在复制时跳过以下字符:
strncat_s(buffer, incomingData, strnlen(incomingData) - 2);
关于c++ - 如何将const char *作为LPCSTR参数的参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61773200/