bool CIOCP::_DoWrite(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT* pIoContext) { if (pIoContext->m_nSendBytes < pIoContext->m_nTotalBytes) { //数据未能发送完,继续发送数据 WSABUF* p_wbuf = &pIoContext->m_wsaBuf; p_wbuf->buf += pIoContext->m_nSendBytes; p_wbuf->len -= pIoContext->m_nSendBytes; PostWrite(pSocketContext,pIoContext); } else { NODEBUF* pNode = pIoContext->m_listBuf.pNode; pNode = pNode->pNext; if(pNode&&pNode->len>0) { WSABUF* p_wbuf = &pIoContext->m_wsaBuf; p_wbuf->buf = pNode->buf; p_wbuf->len = pNode->len; PostWrite(pSocketContext,pIoContext); } else { pIoContext->ResetBuffer(); PostRecv(pSocketContext,pIoContext); } } return TRUE; }
bool MIDIFileWriteMultiTrack::Write ( int num_tracks, int division ) { if ( !PreWrite() ) return false; // first, write the header. writer.WriteFileHeader ( ( num_tracks > 1 )? 1:0, num_tracks, division ); // now write each track for ( int i = 0; i < num_tracks; ++i ) { const MIDITrack *t = multitrack->GetTrack ( i ); if ( !t || !t->EventsOrderOK() ) // time of events out of order: t->SortEventsOrder() must be done externally return false; writer.WriteTrackHeader ( 0 ); // will be rewritten later const MIDITimedBigMessage *ev; MIDIClockTime ev_time = 0; for ( int event_num = 0; event_num < t->GetNumEvents(); ++event_num ) { ev = t->GetEventAddress ( event_num ); if ( !ev ) return false; // don't write to midifile NoOp msgs if ( ev->IsNoOp() ) continue; ev_time = ev->GetTime(); // ignore all msgs after EndOfTrack if ( ev->IsDataEnd() ) break; // write all other msgs writer.WriteEvent ( *ev ); if ( writer.ErrorOccurred() ) return false; } writer.WriteEndOfTrack ( ev_time ); writer.RewriteTrackLength(); } if ( !PostWrite() ) return false; return true; }
bool MIDIFileWriteMultiTrack::Write( int num_tracks, int division ) { bool f=true; if( !PreWrite() ) { return false; } // first, write the header. writer.WriteFileHeader( (num_tracks>0), num_tracks, division ); // now write each track for( int i=0; i<num_tracks; ++i ) { if( writer.ErrorOccurred() ) { f=false; break; } const MIDITrack *t = multitrack->GetTrack(i); MIDIClockTime last_event_time=0; writer.WriteTrackHeader(0); // will be rewritten later if( t ) { for( int event_num=0; event_num<t->GetNumEvents(); ++event_num ) { const MIDITimedBigMessage *ev = t->GetEventAddress( event_num ); if( ev && !ev->IsNoOp() ) { last_event_time = ev->GetTime(); if( !ev->IsDataEnd() ) { writer.WriteEvent( *ev ); if( writer.ErrorOccurred() ) { f=false; break; } } } } } writer.WriteEndOfTrack(0); writer.RewriteTrackLength(); } if( !PostWrite() ) { return false; } return f; }