我在 C++ 中使用 BASS 库时遇到了一点问题。播放效果很好,但我想在播放完当前文件后跳到下一个文件。对于这种需要,BASS 提供了回调,我正在使用它(初始化已经完成)......
富.h:
class Foo
{
public:
Foo(void);
~Foo(void);
void endOfFile(void);
private:
HSTREAM _streamHandle;
void playFile(string);
};
Foo.cpp:
void Foo::playFile(string fileName)
{
_streamHandle = BASS_StreamCreateFile(false, fileName.c_str(), 0, 0, BASS_STREAM_AUTOFREE);
BASS_ChannelSetSync(_streamHandle, BASS_SYNC_END, 0, endOfFileCallback, this);
BASS_ChannelPlay(_streamHandle, true);
void Foo::endOfFile()
{
playFile(getNextFileFromSomewhere()); // obviously this is done different in production code
}
void CALLBACK endOfFileCallback(HSYNC handle, DWORD channel, DWORD data, void* pTarget)
{
Foo* pFoo = static_cast<Foo*>(pTarget);
pFoo->endOfFile();
}
所以,这行得通,但感觉很难看,有一个函数而不是一个称为回调的方法,并反对endOfFile作为公共方法。它应该是私人的。所以我尝试使用一个方法作为回调......
酒吧.h:
class Bar
{
public:
Bar(void);
~Bar(void);
private:
HSTREAM _streamHandle;
void playFile(string);
void endOfFile(void);
void CALLBACK endOfFileCallback(HSYNC, DWORD, DWORD, void*); // now declaration in class
};
酒吧.cpp:
void Bar::playFile(string fileName)
{
_streamHandle = BASS_StreamCreateFile(false, fileName.c_str(), 0, 0, BASS_STREAM_AUTOFREE);
BASS_ChannelSetSync(_streamHandle, BASS_SYNC_END, 0, endOfFileCallback, 0); // no reference to 'this' needed
BASS_ChannelPlay(_streamHandle, true);
void Bar::endOfFile()
{
playFile(getNextFileFromSomewhere()); // obviously this is done different in production code
}
void CALLBACK Bar::endOfFileCallback(HSYNC handle, DWORD channel, DWORD data, void* pTarget)
{
endOfFile();
}
但这不能编译:-(
error: cannot convert
‘Bar::endOfFileCallback’
from type
‘void (Bar::)(HSYNC, DWORD, DWORD, void*) {aka void (**Player**::)(unsigned int, unsigned int, unsigned int, void*)}’
to type
‘void (*)(HSYNC, DWORD, DWORD, void*) {aka void (*)(unsigned int, unsigned int, unsigned int, void*)}’
我猜你看到了区别 (Bar::) 而不是 (*)。所以问题很清楚,但遗憾的是我没有足够的技能来解决它。我只在私人时间做 c++,我对回调、类型和范围没有那么深入。你们能帮我找到一个没有公共方法的工作解决方案吗?
提前致谢!
致命的