我正在使用C ++和windows API编写windows程序,并试图将MIDI消息排入MIdistream,但是当我尝试这样做时收到一个奇怪的错误。 如果我使用midioutShortMsg将未排队的MIDI消息发送到stream,则它可以正常工作。 但是, midistreamOut总是返回错误代码68,即#define d到MCIERR_WAVE_OUTPUTUnspecIFIED 。 midioutGetErrorText给出了下面的错误描述:
当前的MIDI映射器设置是指未安装在系统上的MIDI设备。 使用MIDI映射器编辑设置。
我正在使用windows 7(64位),并尝试用我的系统上的MIDI_MAPPER和全部四个MIDI输出设备的设备ID打开MIdistream,但仍然收到完全相同的错误消息。
以下是打开MIdistream的代码:
如果wpf应用程序没有响应,然后自动重启
可执行文件从命名pipe道启动?
MonoDevelop不在windows上安装:Gtk#问题
在Python 3中使用pythonmagick的蒙太奇?
如何获得在记事本中打开文件的文件名和path?
UINT device_ID = MIDI_MAPPER; //Also trIEd 0,1,2 and 3 midistreamOpen( &mIDi,&device_ID,( DWORD_PTR )hwnd,CALLBACK_WINDOW );
以下是发送MIDI信息的代码:
MIDIHDR header; MIDIEVENT *event; event = ( MIDIEVENT * )malloc( sizeof( *event ) ); event->DWDeltaTime = delta_time; event->DWStreamID = 0; event->DWEvent = ( MEVT_F_SHORT | MEVT_SHORTMSG ) << 24 | ( msg & 0x00FFFFFF ); header.lpData = ( LPSTR )event; header.DWBufferLength = sizeof( *event ); header.DWBytesRecorded = sizeof( *event ); header.DWUser = 0; header.DWFlags = 0; header.DWOffset = 0; midioutPrepareheader( ( HMIdioUT )mIDi,&header,sizeof( header ) ); midistreamOut( mIDi,sizeof( header ) );
我该如何解决这个问题?
如何使C#应用程序充当服务?
Python 2.7仍然访问Python 3.4目录
捕获API /工具的平台详细信息 – 与windows错误报告等效
如何绑定windows Phone 7中的XML文件的dynamic多列表数据?
在第三方应用程序中创build窗口作为孩子
问题是我正在使用整个事件结构作为MIDI流的缓冲区。 事实证明,该结构的第四个成员DWParms实际上应该从短消息中省略。 要更正发布的问题中的代码,可以将两行代码更改为以下内容:
header.DWBufferLength = sizeof( *event ) - sizeof( event->DWParms ); header.DWBytesRecorded = sizeof( *event ) - sizeof( event->DWParms );
在向流中添加多个事件时,使用一个DWORD数组实际上更容易,而不是对MIDIEVENT结构MIDIEVENT困扰。
对于使用windows API进行MIDI编程的任何人,请注意,某些MSDN文档具有误导性,不足或完全错误。
MIDIEVENT结构的文档说明如下:
DWParms
如果DWEvent指定MEVT_F_SHORT,则不要在流缓冲区中使用此成员。
这是不明确的,因为“使用”不是意指“包括”而不是“指定”。
以下是程序员需要了解的另外两个缺陷:
DWEvent
事件代码和事件参数或长度。 […]该成员的高字节包含标志和事件代码。 必须指定MEVT_F_LONG或MEVT_F_SHORT标志。 MEVT_F_CALLBACK标志是可选的。
当选中头文件时, MEVT_F_预处理器定义实际上指定了完整的DWORD而不仅仅是单个标志,所以在我的代码中,指定这个成员的行应该如下所示:
event->DWEvent = MEVT_F_SHORT | MEVT_SHORTMSG << 24 | ( msg & 0x00FFFFFF );
除此之外,还发现包含MIDIHDR结构的内存应该保留,直到缓冲区结束播放为止,所以在大多数实现中,它应该分配在堆上而不是堆栈中。
总结以上是内存溢出为你收集整理的在Windows中使用MIDIstream的问题全部内容,希望文章能够帮你解决在Windows中使用MIDIstream的问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)