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
// 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++;

View File

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

View File

@ -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

View File

@ -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<NoteTrack*>(track.get()));
noteTrackArray.push_back(static_cast<NoteTrack*>(track.get()));
}
}

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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,

View File

@ -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 {