[Media_api] Windows midiOutLongMsg strangeness
Ben Allison
benski at winamp.com
Thu Dec 21 12:29:28 PST 2006
Roger,
Just to make sure we're on the same page, here's what the revised code
would look like with the prepare/unprepare stuff in place
m->hdr->dwBufferLength = m->sysex_byte_count;
/* DEBUG CODE: */
{ int i; int len = m->hdr->dwBufferLength;
/* added */
if (m->hdr->dwFlags & MHDR_PREPARED)
midiOutUnprepareHeader(m->handle.out, m->hdr, sizeof(MIDIHDR));
/* ----- */
char *newmsg = (char *) malloc(len);
for (i = 0; i < len; i++) newmsg[i] = m->hdr->lpData[i];
m->hdr->lpData = newmsg;
/* added */
m->hdr->dwFlags=0;
midiOutPrepareHeader(m->handle.out, m->hdr, sizeof(MIDIHDR));
/* ----- */
}
m->error = midiOutLongMsg(m->handle.out, m->hdr, sizeof(MIDIHDR));
if (m->error) rslt = pmHostError;
-Ben Allison
Roger Dannenberg wrote:
> Yes, I call unprepare when buffers are returned, but in most of these
> tests, I'm using the buffer for the first time when the failure
> occurs. I'm checking that midiOutPrepareHeader sets the dwFlags field
> like it's supposed to. (Keep those ideas coming -- there must be
> something I haven' thought of. I've asked the Midi Ox developer about
> some internal details of their code, and I've checked rtMidi -- which
> uses malloc() for every sysex send -- and I'd be interested to see any
> other source that successfully sends sysex messages.) -Roger
>
> ----- in reply to ------
>
> Roger,
> Did you unprepare (midiOutUnprepareHeader) first? If the MIDIHDR that
> was
> passed in was already prepared, you'll need to do this. The MIDIHDR data
> structure stores a bool to indicate whether or not it's already been
> prepared. If it's been prepared already, midiOutPrepareHeader exits
> immediately without doing anything (or at least the documentation
> suggests
> so).
>
> -Ben Allison
More information about the media_api
mailing list