[wdmaudiodev] Re: Solution to DX MIDI in thread saga

  • From: Matt Gonzalez <matt@xxxxxxxxxxxxx>
  • To: wdmaudiodev@xxxxxxxxxxxxx
  • Date: Mon, 07 Feb 2005 13:33:46 -0800

Nifty!

Where are you getting the clone?

Are you just deleting the clone after filling it out, or are you advancing it?

Matt


Waldemar Haszlakiewicz wrote:

A few weeks ago I posted a bug report on DX MIDI in thread.
Now Stephan found a beautiful solution with clone deleting technique, where 
here is another
upgrade to that idea. The code below doesn't lend in the bug zone no matter what
size the data is (well from 1 to 44 bytes of data can be send in single 
streamPointer).

So thanks Stephan.

Peace
Waldemar


pStreamPointer = KsPinGetLeadingEdgeStreamPointer( pin, KSSTREAM_POINTER_STATE_LOCKED ); //Set and send data to DX driver. if ( SUCCESS( Status ) ) { //DX driver uses DMUS_EVENTHEADER. // //typedef struct _DMUS_EVENTHEADER //{ // DWORD cbEvent; Unrounded bytes in event // DWORD dwChannelGroup; Channel group of event // REFERENCE_TIME rtDelta; Delta from start time of entire buffer // DWORD dwFlags; Flags DMUS_EVENT_xxx //} DMUS_EVENTHEADER; // //Initialize. pData = (DMUS_EVENTHEADER*)pStreamPointer_clone->OffsetOut.Data; pData_midi = (BYTE*)( pData + 1 ); byteCount = pMidiCommand->offsetInData;

 //Set dataUsed and DMUS_EVENTHEADER.
   pStreamPointer_clone->StreamHeader->DataUsed = DMUS_EVENT_SIZE( byteCount );
   pData->cbEvent = byteCount;
   pData->dwChannelGroup = 0;
   pData->rtDelta = 0;
   if ( byteCount > 3 )
   {
     pData->dwFlags = 0; //no order (DMUS_EVENT_STRUCTURED)
   }
   else
   {
     pData->dwFlags = DMUS_EVENT_STRUCTURED;
   }

 //Set data.
   RtlCopyBytes( pData_midi, &pMidiCommand->data, byteCount );

 //Set the streamPointer.
   pStreamPointer_clone->StreamHeader->PresentationTime.Time = 
pMidiCommand->timeStamp;
   pStreamPointer_clone->StreamHeader->PresentationTime.Denominator = 1;
   pStreamPointer_clone->StreamHeader->PresentationTime.Numerator = 1;
   pStreamPointer_clone->StreamHeader->OptionsFlags |= 
KSSTREAM_HEADER_OPTIONSF_TIMEVALID;

 //Advance streamPointer and unlock it (the brute force way).
    KsStreamPointerAdvanceOffsetsAndUnlock(
      pStreamPointer,
      0,
      0,
      TRUE
   );
 }
 return;
}


******************

WDMAUDIODEV addresses:
Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
Subscribe:    mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
Unsubscribe:  mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx

URL to WDMAUDIODEV page:
http://www.wdmaudiodev.de/




******************

WDMAUDIODEV addresses:
Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
Subscribe:    mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
Unsubscribe:  mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx

URL to WDMAUDIODEV page:
http://www.wdmaudiodev.de/

Other related posts: