diff --git a/src/AudioIO.cpp b/src/AudioIO.cpp index a2ad3705e..5c1ec97e1 100644 --- a/src/AudioIO.cpp +++ b/src/AudioIO.cpp @@ -770,7 +770,7 @@ class AudioThread { // The normal wxThread-derived AudioThread class for all other // platforms: -class AudioThread final : public wxThread { +class AudioThread /* not final */ : public wxThread { public: AudioThread():wxThread(wxTHREAD_JOINABLE) {} ExitCode Entry() override; @@ -781,7 +781,7 @@ class AudioThread final : public wxThread { #ifdef EXPERIMENTAL_MIDI_OUT class MidiThread final : public AudioThread { public: - virtual ExitCode Entry(); + ExitCode Entry() override; }; #endif @@ -922,7 +922,7 @@ AudioIO::AudioIO() _("There was an error initializing the midi i/o layer.\n"); errStr += _("You will not be able to play midi.\n\n"); wxString pmErrStr = LAT1CTOWX(Pm_GetErrorText(pmErr)); - if (pmErrStr) + if (!pmErrStr.empty()) errStr += _("Error: ") + pmErrStr; // XXX: we are in libaudacity, popping up dialogs not allowed! A // long-term solution will probably involve exceptions @@ -1668,7 +1668,7 @@ int AudioIO::StartStream(WaveTrackArray playbackTracks, bool successMidi = true; - if(!mMidiPlaybackTracks.IsEmpty()){ + if(!mMidiPlaybackTracks.empty()){ successMidi = StartPortMidiStream(); } @@ -1979,7 +1979,7 @@ PmTimestamp MidiTime(void *info) void AudioIO::PrepareMidiIterator(bool send, double offset) { int i; - int nTracks = mMidiPlaybackTracks.GetCount(); + int nTracks = mMidiPlaybackTracks.size(); // instead of initializing with an Alg_seq, we use begin_seq() // below to add ALL Alg_seq's. mIterator = new Alg_iterator(NULL, false); @@ -2008,7 +2008,7 @@ void AudioIO::PrepareMidiIterator(bool send, double offset) bool AudioIO::StartPortMidiStream() { int i; - int nTracks = mMidiPlaybackTracks.GetCount(); + int nTracks = mMidiPlaybackTracks.size(); // Only start MIDI stream if there is an open track if (nTracks == 0) return false; @@ -2232,7 +2232,7 @@ void AudioIO::StopStream() mIterator->end(); // set in_use flags to false - int nTracks = mMidiPlaybackTracks.GetCount(); + int nTracks = mMidiPlaybackTracks.size(); for (int i = 0; i < nTracks; i++) { NoteTrack *t = mMidiPlaybackTracks[i]; Alg_seq_ptr seq = t->GetSequence(); @@ -2857,7 +2857,8 @@ MidiThread::ExitCode MidiThread::Entry() gAudioIO->mMidiPlaySpeed + gAudioIO->mT0; gAudioIO->mMidiOutputComplete = - (!gAudioIO->mPlayLooped && timeAtSpeed >= gAudioIO->mT1 + 0.220); + (gAudioIO->mPlayMode == gAudioIO->PLAY_STRAIGHT && // PRL: what if scrubbing? + timeAtSpeed >= gAudioIO->mT1 + 0.220); // !gAudioIO->mNextEvent); } } @@ -3527,7 +3528,7 @@ void AudioIO::OutputEvent() // all notes off on all channels" if (mNextEvent == &gAllNotesOff) { AllNotesOff(); - if (mPlayLooped) { + if (mPlayMode == gAudioIO->PLAY_LOOPED) { // jump back to beginning of loop mMidiLoopOffset += (mT1 - mT0); PrepareMidiIterator(false, mMidiLoopOffset); @@ -3667,14 +3668,14 @@ bool AudioIO::SetHasSolo(bool hasSolo) void AudioIO::FillMidiBuffers() { bool hasSolo = false; - int numPlaybackTracks = gAudioIO->mPlaybackTracks->GetCount(); + int numPlaybackTracks = gAudioIO->mPlaybackTracks->size(); int t; for(t = 0; t < numPlaybackTracks; t++ ) - if( gAudioIO->mPlaybackTracks[t]->GetSolo() ) { + if( (*gAudioIO->mPlaybackTracks)[t]->GetSolo() ) { hasSolo = true; break; } - int numMidiPlaybackTracks = gAudioIO->mMidiPlaybackTracks.GetCount(); + int numMidiPlaybackTracks = gAudioIO->mMidiPlaybackTracks.size(); for(t = 0; t < numMidiPlaybackTracks; t++ ) if( gAudioIO->mMidiPlaybackTracks[t]->GetSolo() ) { hasSolo = true; @@ -3698,7 +3699,7 @@ void AudioIO::FillMidiBuffers() // buffer, the cursor tends to jump back to mT0 early. // Therefore, if we are in loop mode, and if mTime < mT0, // we must not be at the end of the loop yet. - if (mPlayLooped && trackTime < mT0) { + if (mPlayMode == gAudioIO->PLAY_LOOPED && trackTime < mT0) { trackTime += (mT1 - mT0); } // mTime is shared with another thread so we stored @@ -4142,7 +4143,7 @@ int audacityAudioCallback(const void *inputBuffer, void *outputBuffer, if( (*gAudioIO->mPlaybackTracks)[t]->GetSolo() ) numSolo++; #ifdef EXPERIMENTAL_MIDI_OUT - int numMidiPlaybackTracks = gAudioIO->mMidiPlaybackTracks.GetCount(); + int numMidiPlaybackTracks = gAudioIO->mMidiPlaybackTracks.size(); for( t = 0; t < numMidiPlaybackTracks; t++ ) if( gAudioIO->mMidiPlaybackTracks[t]->GetSolo() ) numSolo++; diff --git a/src/AudioIO.h b/src/AudioIO.h index 1acb6ea34..171139a1d 100644 --- a/src/AudioIO.h +++ b/src/AudioIO.h @@ -18,11 +18,18 @@ #include "Experimental.h" #ifdef USE_MIDI + #ifdef EXPERIMENTAL_MIDI_OUT #include "portmidi.h" #include "porttime.h" #include "allegro.h" + +#include +class NoteTrack; +using NoteTrackArray = std::vector < NoteTrack* >; + #endif // EXPERIMENTAL_MIDI_OUT + #endif // USE_MIDI #if USE_PORTMIXER diff --git a/src/MixerBoard.cpp b/src/MixerBoard.cpp index 4b7de1669..574e733e9 100644 --- a/src/MixerBoard.cpp +++ b/src/MixerBoard.cpp @@ -1244,7 +1244,7 @@ wxBitmap* MixerBoard::GetMusicalInstrumentBitmap(const WaveTrack* pLeftTrack) // random choice: return mMusicalInstruments[(int)pLeftTrack % mMusicalInstruments.GetCount()].mBitmap; #ifdef EXPERIMENTAL_MIDI_OUT - const wxString strTrackName(name.MakeLower()); + const wxString strTrackName(wxString{ name }.MakeLower()); #else const wxString strTrackName(pLeftTrack->GetName().MakeLower()); #endif diff --git a/src/Track.cpp b/src/Track.cpp index ca3104a63..c21347ec5 100644 --- a/src/Track.cpp +++ b/src/Track.cpp @@ -1303,7 +1303,7 @@ NoteTrackArray TrackList::GetNoteTrackArray(bool selectionOnly) for(const auto &track : *this) { if (track->GetKind() == Track::Note && (track->GetSelected() || !selectionOnly)) { - noteTrackArray.Add(static_cast(track.get())); + noteTrackArray.push_back(static_cast(track.get())); } } diff --git a/src/Track.h b/src/Track.h index 1bbf3eac8..3084dd752 100644 --- a/src/Track.h +++ b/src/Track.h @@ -36,6 +36,7 @@ class Track; class LabelTrack; class TimeTrack; class WaveTrack; +class NoteTrack; class AudacityProject; class ZoomInfo; @@ -60,9 +61,10 @@ public: #endif }; +using NoteTrackArray = std::vector < NoteTrack* >; + #if defined(USE_MIDI) class NoteTrack; -WX_DEFINE_USER_EXPORTED_ARRAY(NoteTrack*, NoteTrackArray, class AUDACITY_DLL_API); #endif class TrackList; diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index f8f802aa4..4db423f2e 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -5429,7 +5429,7 @@ void TrackPanel::HandleSliders(wxMouseEvent &event, bool pan) UndoPush::CONSOLIDATE); #ifdef EXPERIMENTAL_MIDI_OUT } else { - MakeParentPushState(_("Moved velocity slider"), _("Velocity"), true); + MakeParentPushState(_("Moved velocity slider"), _("Velocity"), UndoPush::CONSOLIDATE); } #endif SetCapturedTrack( NULL ); @@ -10000,13 +10000,18 @@ void TrackInfo::DrawVelocitySlider(wxDC *dc, NoteTrack *t, wxRect rect) const { wxRect gainRect; int index = t->GetIndex(); - EnsureSufficientSliders(index); + + //EnsureSufficientSliders(index); + GetGainRect(rect, gainRect); if (gainRect.y + gainRect.height < rect.y + rect.height - 19) { - mGains[index]->SetStyle(VEL_SLIDER); + auto &gain = mGain; // mGains[index]; + gain->SetStyle(VEL_SLIDER); GainSlider(index)->Move(wxPoint(gainRect.x, gainRect.y)); GainSlider(index)->Set(t->GetGain()); - GainSlider(index)->OnPaint(*dc, t->GetSelected()); + GainSlider(index)->OnPaint(*dc + // , t->GetSelected() + ); } } #endif diff --git a/src/TrackPanel.h b/src/TrackPanel.h index d4f13fea5..d097d3c10 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -110,6 +110,10 @@ public: LWSlider * GainSlider(WaveTrack *t, bool captured = false) const; LWSlider * PanSlider(WaveTrack *t, bool captured = false) const; +#ifdef EXPERIMENTAL_MIDI_OUT + LWSlider *GainSlider(int index) const; +#endif + private: TrackPanel * pParent; wxFont mFont; diff --git a/src/prefs/MidiIOPrefs.cpp b/src/prefs/MidiIOPrefs.cpp index b8a0c816f..926775602 100644 --- a/src/prefs/MidiIOPrefs.cpp +++ b/src/prefs/MidiIOPrefs.cpp @@ -120,7 +120,7 @@ void MidiIOPrefs::PopulateOrExchange( ShuttleGui & S ) { { S.Id(HostID); /* i18n-hint: (noun) */ - mHost = S.TieChoice(_("Host":), + mHost = S.TieChoice(_("Host:"), wxT("/MidiIO/Host"), wxT(""), mHostNames, diff --git a/src/toolbars/ControlToolBar.cpp b/src/toolbars/ControlToolBar.cpp index ccc8a72dd..662fec926 100644 --- a/src/toolbars/ControlToolBar.cpp +++ b/src/toolbars/ControlToolBar.cpp @@ -843,7 +843,7 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt) if(duplex){ playbackTracks = trackList->GetWaveTrackArray(false); #ifdef EXPERIMENTAL_MIDI_OUT - midiTracks = t->GetNoteTrackArray(false); + midiTracks = trackList->GetNoteTrackArray(false); #endif } else {