void DecodedStream::SendData() { AssertOwnerThread(); MOZ_ASSERT(mStartTime.isSome(), "Must be called after StartPlayback()"); // Not yet created on the main thread. MDSM will try again later. if (!mData) { return; } // Nothing to do when the stream is finished. if (mData->mHaveSentFinish) { return; } SendAudio(mParams.mVolume, mSameOrigin, mPrincipalHandle); SendVideo(mSameOrigin, mPrincipalHandle); AdvanceTracks(); bool finished = (!mInfo.HasAudio() || mAudioQueue.IsFinished()) && (!mInfo.HasVideo() || mVideoQueue.IsFinished()); if (finished && !mData->mHaveSentFinish) { mData->mHaveSentFinish = true; mData->mStream->Finish(); } }
void ShowPanLane(Trk* trk, Pattern* pt) { trk->pan_lane.visible = true; trk->end_line += trk->pan_lane.height; trk->UpdateLaneBases(); pt->track_line_end += trk->vol_lane.height; pt->num_lines += trk->vol_lane.height; AdvanceTracks(trk->next, trk->pan_lane.height, pt); }
void HidePanLane(Trk* trk, Pattern* pt) { trk->pan_lane.visible = false; trk->end_line -= trk->pan_lane.height; trk->UpdateLaneBases(); pt->track_line_end -= trk->pan_lane.height; pt->num_lines -= trk->pan_lane.height; AdvanceTracks(trk->next, -trk->pan_lane.height, pt); }
DWORD *MIDISong2::MakeEvents(DWORD *events, DWORD *max_event_p, DWORD max_time) { DWORD *start_events; DWORD tot_time = 0; DWORD time = 0; DWORD delay; start_events = events; while (TrackDue && events < max_event_p && tot_time <= max_time) { // It's possible that this tick may be nothing but meta-events and // not generate any real events. Repeat this until we actually // get some output so we don't send an empty buffer to the MIDI // device. do { delay = TrackDue->Delay; time += delay; // Advance time for all tracks by the amount needed for the one up next. tot_time += delay * Tempo / Division; AdvanceTracks(delay); // Play all events for this tick. do { bool sysex_noroom = false; DWORD *new_events = SendCommand(events, TrackDue, time, max_event_p - events, sysex_noroom); if (sysex_noroom) { return events; } TrackDue = FindNextDue(); if (new_events != events) { time = 0; } events = new_events; } while (TrackDue && TrackDue->Delay == 0 && events < max_event_p); } while (start_events == events && TrackDue); time = 0; } return events; }
uint32_t *HMISong::MakeEvents(uint32_t *events, uint32_t *max_event_p, uint32_t max_time) { uint32_t *start_events; uint32_t tot_time = 0; uint32_t time = 0; uint32_t delay; start_events = events; while (TrackDue && events < max_event_p && tot_time <= max_time) { // It's possible that this tick may be nothing but meta-events and // not generate any real events. Repeat this until we actually // get some output so we don't send an empty buffer to the MIDI // device. do { delay = TrackDue->Delay; time += delay; // Advance time for all tracks by the amount needed for the one up next. tot_time += delay * Tempo / Division; AdvanceTracks(delay); // Play all events for this tick. do { uint32_t *new_events = SendCommand(events, TrackDue, time); TrackDue = FindNextDue(); if (new_events != events) { time = 0; } events = new_events; } while (TrackDue && TrackDue->Delay == 0 && events < max_event_p); } while (start_events == events && TrackDue); time = 0; } return events; }