1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-09 08:31:13 +02:00

Make EXPERIMENTAL_MIDI_OUT compilable, but it doesn't link

This commit is contained in:
Paul Licameli 2016-04-09 15:10:05 -04:00
parent 6ca3f25826
commit b28ec2957a
9 changed files with 42 additions and 23 deletions

View File

@ -770,7 +770,7 @@ class AudioThread {
// The normal wxThread-derived AudioThread class for all other // The normal wxThread-derived AudioThread class for all other
// platforms: // platforms:
class AudioThread final : public wxThread { class AudioThread /* not final */ : public wxThread {
public: public:
AudioThread():wxThread(wxTHREAD_JOINABLE) {} AudioThread():wxThread(wxTHREAD_JOINABLE) {}
ExitCode Entry() override; ExitCode Entry() override;
@ -781,7 +781,7 @@ class AudioThread final : public wxThread {
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
class MidiThread final : public AudioThread { class MidiThread final : public AudioThread {
public: public:
virtual ExitCode Entry(); ExitCode Entry() override;
}; };
#endif #endif
@ -922,7 +922,7 @@ AudioIO::AudioIO()
_("There was an error initializing the midi i/o layer.\n"); _("There was an error initializing the midi i/o layer.\n");
errStr += _("You will not be able to play midi.\n\n"); errStr += _("You will not be able to play midi.\n\n");
wxString pmErrStr = LAT1CTOWX(Pm_GetErrorText(pmErr)); wxString pmErrStr = LAT1CTOWX(Pm_GetErrorText(pmErr));
if (pmErrStr) if (!pmErrStr.empty())
errStr += _("Error: ") + pmErrStr; errStr += _("Error: ") + pmErrStr;
// XXX: we are in libaudacity, popping up dialogs not allowed! A // XXX: we are in libaudacity, popping up dialogs not allowed! A
// long-term solution will probably involve exceptions // long-term solution will probably involve exceptions
@ -1668,7 +1668,7 @@ int AudioIO::StartStream(WaveTrackArray playbackTracks,
bool successMidi = true; bool successMidi = true;
if(!mMidiPlaybackTracks.IsEmpty()){ if(!mMidiPlaybackTracks.empty()){
successMidi = StartPortMidiStream(); successMidi = StartPortMidiStream();
} }
@ -1979,7 +1979,7 @@ PmTimestamp MidiTime(void *info)
void AudioIO::PrepareMidiIterator(bool send, double offset) void AudioIO::PrepareMidiIterator(bool send, double offset)
{ {
int i; int i;
int nTracks = mMidiPlaybackTracks.GetCount(); int nTracks = mMidiPlaybackTracks.size();
// instead of initializing with an Alg_seq, we use begin_seq() // instead of initializing with an Alg_seq, we use begin_seq()
// below to add ALL Alg_seq's. // below to add ALL Alg_seq's.
mIterator = new Alg_iterator(NULL, false); mIterator = new Alg_iterator(NULL, false);
@ -2008,7 +2008,7 @@ void AudioIO::PrepareMidiIterator(bool send, double offset)
bool AudioIO::StartPortMidiStream() bool AudioIO::StartPortMidiStream()
{ {
int i; int i;
int nTracks = mMidiPlaybackTracks.GetCount(); int nTracks = mMidiPlaybackTracks.size();
// Only start MIDI stream if there is an open track // Only start MIDI stream if there is an open track
if (nTracks == 0) if (nTracks == 0)
return false; return false;
@ -2232,7 +2232,7 @@ void AudioIO::StopStream()
mIterator->end(); mIterator->end();
// set in_use flags to false // set in_use flags to false
int nTracks = mMidiPlaybackTracks.GetCount(); int nTracks = mMidiPlaybackTracks.size();
for (int i = 0; i < nTracks; i++) { for (int i = 0; i < nTracks; i++) {
NoteTrack *t = mMidiPlaybackTracks[i]; NoteTrack *t = mMidiPlaybackTracks[i];
Alg_seq_ptr seq = t->GetSequence(); Alg_seq_ptr seq = t->GetSequence();
@ -2857,7 +2857,8 @@ MidiThread::ExitCode MidiThread::Entry()
gAudioIO->mMidiPlaySpeed + gAudioIO->mT0; gAudioIO->mMidiPlaySpeed + gAudioIO->mT0;
gAudioIO->mMidiOutputComplete = 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); // !gAudioIO->mNextEvent);
} }
} }
@ -3527,7 +3528,7 @@ void AudioIO::OutputEvent()
// all notes off on all channels" // all notes off on all channels"
if (mNextEvent == &gAllNotesOff) { if (mNextEvent == &gAllNotesOff) {
AllNotesOff(); AllNotesOff();
if (mPlayLooped) { if (mPlayMode == gAudioIO->PLAY_LOOPED) {
// jump back to beginning of loop // jump back to beginning of loop
mMidiLoopOffset += (mT1 - mT0); mMidiLoopOffset += (mT1 - mT0);
PrepareMidiIterator(false, mMidiLoopOffset); PrepareMidiIterator(false, mMidiLoopOffset);
@ -3667,14 +3668,14 @@ bool AudioIO::SetHasSolo(bool hasSolo)
void AudioIO::FillMidiBuffers() void AudioIO::FillMidiBuffers()
{ {
bool hasSolo = false; bool hasSolo = false;
int numPlaybackTracks = gAudioIO->mPlaybackTracks->GetCount(); int numPlaybackTracks = gAudioIO->mPlaybackTracks->size();
int t; int t;
for(t = 0; t < numPlaybackTracks; t++ ) for(t = 0; t < numPlaybackTracks; t++ )
if( gAudioIO->mPlaybackTracks[t]->GetSolo() ) { if( (*gAudioIO->mPlaybackTracks)[t]->GetSolo() ) {
hasSolo = true; hasSolo = true;
break; break;
} }
int numMidiPlaybackTracks = gAudioIO->mMidiPlaybackTracks.GetCount(); int numMidiPlaybackTracks = gAudioIO->mMidiPlaybackTracks.size();
for(t = 0; t < numMidiPlaybackTracks; t++ ) for(t = 0; t < numMidiPlaybackTracks; t++ )
if( gAudioIO->mMidiPlaybackTracks[t]->GetSolo() ) { if( gAudioIO->mMidiPlaybackTracks[t]->GetSolo() ) {
hasSolo = true; hasSolo = true;
@ -3698,7 +3699,7 @@ void AudioIO::FillMidiBuffers()
// buffer, the cursor tends to jump back to mT0 early. // buffer, the cursor tends to jump back to mT0 early.
// Therefore, if we are in loop mode, and if mTime < mT0, // Therefore, if we are in loop mode, and if mTime < mT0,
// we must not be at the end of the loop yet. // 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); trackTime += (mT1 - mT0);
} }
// mTime is shared with another thread so we stored // 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() ) if( (*gAudioIO->mPlaybackTracks)[t]->GetSolo() )
numSolo++; numSolo++;
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
int numMidiPlaybackTracks = gAudioIO->mMidiPlaybackTracks.GetCount(); int numMidiPlaybackTracks = gAudioIO->mMidiPlaybackTracks.size();
for( t = 0; t < numMidiPlaybackTracks; t++ ) for( t = 0; t < numMidiPlaybackTracks; t++ )
if( gAudioIO->mMidiPlaybackTracks[t]->GetSolo() ) if( gAudioIO->mMidiPlaybackTracks[t]->GetSolo() )
numSolo++; numSolo++;

View File

@ -18,11 +18,18 @@
#include "Experimental.h" #include "Experimental.h"
#ifdef USE_MIDI #ifdef USE_MIDI
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
#include "portmidi.h" #include "portmidi.h"
#include "porttime.h" #include "porttime.h"
#include "allegro.h" #include "allegro.h"
#include <vector>
class NoteTrack;
using NoteTrackArray = std::vector < NoteTrack* >;
#endif // EXPERIMENTAL_MIDI_OUT #endif // EXPERIMENTAL_MIDI_OUT
#endif // USE_MIDI #endif // USE_MIDI
#if USE_PORTMIXER #if USE_PORTMIXER

View File

@ -1244,7 +1244,7 @@ wxBitmap* MixerBoard::GetMusicalInstrumentBitmap(const WaveTrack* pLeftTrack)
// random choice: return mMusicalInstruments[(int)pLeftTrack % mMusicalInstruments.GetCount()].mBitmap; // random choice: return mMusicalInstruments[(int)pLeftTrack % mMusicalInstruments.GetCount()].mBitmap;
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
const wxString strTrackName(name.MakeLower()); const wxString strTrackName(wxString{ name }.MakeLower());
#else #else
const wxString strTrackName(pLeftTrack->GetName().MakeLower()); const wxString strTrackName(pLeftTrack->GetName().MakeLower());
#endif #endif

View File

@ -1303,7 +1303,7 @@ NoteTrackArray TrackList::GetNoteTrackArray(bool selectionOnly)
for(const auto &track : *this) { for(const auto &track : *this) {
if (track->GetKind() == Track::Note && if (track->GetKind() == Track::Note &&
(track->GetSelected() || !selectionOnly)) { (track->GetSelected() || !selectionOnly)) {
noteTrackArray.Add(static_cast<NoteTrack*>(track.get())); noteTrackArray.push_back(static_cast<NoteTrack*>(track.get()));
} }
} }

View File

@ -36,6 +36,7 @@ class Track;
class LabelTrack; class LabelTrack;
class TimeTrack; class TimeTrack;
class WaveTrack; class WaveTrack;
class NoteTrack;
class AudacityProject; class AudacityProject;
class ZoomInfo; class ZoomInfo;
@ -60,9 +61,10 @@ public:
#endif #endif
}; };
using NoteTrackArray = std::vector < NoteTrack* >;
#if defined(USE_MIDI) #if defined(USE_MIDI)
class NoteTrack; class NoteTrack;
WX_DEFINE_USER_EXPORTED_ARRAY(NoteTrack*, NoteTrackArray, class AUDACITY_DLL_API);
#endif #endif
class TrackList; class TrackList;

View File

@ -5429,7 +5429,7 @@ void TrackPanel::HandleSliders(wxMouseEvent &event, bool pan)
UndoPush::CONSOLIDATE); UndoPush::CONSOLIDATE);
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
} else { } else {
MakeParentPushState(_("Moved velocity slider"), _("Velocity"), true); MakeParentPushState(_("Moved velocity slider"), _("Velocity"), UndoPush::CONSOLIDATE);
} }
#endif #endif
SetCapturedTrack( NULL ); SetCapturedTrack( NULL );
@ -10000,13 +10000,18 @@ void TrackInfo::DrawVelocitySlider(wxDC *dc, NoteTrack *t, wxRect rect) const
{ {
wxRect gainRect; wxRect gainRect;
int index = t->GetIndex(); int index = t->GetIndex();
EnsureSufficientSliders(index);
//EnsureSufficientSliders(index);
GetGainRect(rect, gainRect); GetGainRect(rect, gainRect);
if (gainRect.y + gainRect.height < rect.y + rect.height - 19) { 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)->Move(wxPoint(gainRect.x, gainRect.y));
GainSlider(index)->Set(t->GetGain()); GainSlider(index)->Set(t->GetGain());
GainSlider(index)->OnPaint(*dc, t->GetSelected()); GainSlider(index)->OnPaint(*dc
// , t->GetSelected()
);
} }
} }
#endif #endif

View File

@ -110,6 +110,10 @@ public:
LWSlider * GainSlider(WaveTrack *t, bool captured = false) const; LWSlider * GainSlider(WaveTrack *t, bool captured = false) const;
LWSlider * PanSlider(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: private:
TrackPanel * pParent; TrackPanel * pParent;
wxFont mFont; wxFont mFont;

View File

@ -120,7 +120,7 @@ void MidiIOPrefs::PopulateOrExchange( ShuttleGui & S ) {
{ {
S.Id(HostID); S.Id(HostID);
/* i18n-hint: (noun) */ /* i18n-hint: (noun) */
mHost = S.TieChoice(_("Host":), mHost = S.TieChoice(_("Host:"),
wxT("/MidiIO/Host"), wxT("/MidiIO/Host"),
wxT(""), wxT(""),
mHostNames, mHostNames,

View File

@ -843,7 +843,7 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
if(duplex){ if(duplex){
playbackTracks = trackList->GetWaveTrackArray(false); playbackTracks = trackList->GetWaveTrackArray(false);
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
midiTracks = t->GetNoteTrackArray(false); midiTracks = trackList->GetNoteTrackArray(false);
#endif #endif
} }
else { else {