【发布时间】:2015-03-19 04:37:31
【问题描述】:
我有一些想要从线程中播放的 wav 声音。我在程序启动时将声音加载到内存中,然后使用 Windows 函数 PlaySound 播放它们。这可行,但是当我尝试从线程播放声音时,我得到一个 AccessViolationException,“尝试读取或写入受保护的内存”。
有没有办法将文件加载到 char 数组中,然后从单独的线程中读取?
这是我用来加载和播放声音文件的代码。
// Code to load sound from file into char*.
ifstream ifs(WaveSounds::sounds::StartupMusic, ios::binary | ios::ate);
// The ios::ate flag sets the filestream
// to the end position, so it's already
// ata the end when we call 'tellg()'.
if (&std::ios::ios_base::good)
{
int length = ifs.tellg();
ifs.seekg(0, ifs.beg);
// Load into the Char * , 'n_StartMusic'.
n_StartMusic = new char[length];
ifs.read(n_StartMusic, length);
ifs.close();
}
// Plays sound from thread, causes AccessViolationException.
static void PlaySoundThread()
{
PlaySound((LPWSTR)WaveSounds::n_CurSound, NULL, SND_MEMORY | SND_ASYNC);
}
// Method that sets sound to play and starts thread.
void WaveSounds::Play_Sound(char* sound)
{
n_CurSound = sound;
n_hmod = GetModuleHandle(0);
Thread^ t = gcnew Thread(gcnew ThreadStart(PlaySoundThread));
t->IsBackground = true;
t->Start();
}
【问题讨论】:
标签: c++ multithreading audio