Update of /cvsroot/audacity/audacity-src/src/prefs
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv11472/src/prefs

Modified Files:
        DevicePrefs.cpp MidiIOPrefs.cpp MidiIOPrefs.h PrefsDialog.cpp 
Log Message:
Added the 'portmidi' library (used for MIDI playback) to the repository.
Edited AudioIO.cpp to allow for MIDI playback (all changes are wrapped within 
EXPERIMENTAL_MIDI_OUT).
Edited MidiIOprefs.cpp to allow changing MIDI devices via the MIDI preferences 
panel.
Other various MIDI-related bug fixes in portmidi, portsmf, and libscorealign.

Index: PrefsDialog.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/prefs/PrefsDialog.cpp,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -d -r1.66 -r1.67
--- PrefsDialog.cpp     14 Jun 2009 05:30:14 -0000      1.66
+++ PrefsDialog.cpp     24 Jun 2009 20:37:29 -0000      1.67
@@ -59,9 +59,9 @@
 #include "TracksPrefs.h"
 #include "WarningsPrefs.h"
 
-/* REQUIRES PORTMIDI */
-//#include "MidiIOPrefs.h"
-
+#ifdef EXPERIMENTAL_MIDI_OUT
+#include "MidiIOPrefs.h"
+#endif
 
 BEGIN_EVENT_TABLE(PrefsDialog, wxDialog)
    EVT_BUTTON(wxID_OK, PrefsDialog::OnOK)
@@ -89,8 +89,9 @@
          w = new DevicePrefs(mCategories);      mCategories->AddPage(w, 
w->GetName(), false, 0);
          w = new PlaybackPrefs(mCategories);    mCategories->AddPage(w, 
w->GetName(), false, 0);
          w = new RecordingPrefs(mCategories);   mCategories->AddPage(w, 
w->GetName(), false, 0);
-//       REQUIRES PORTMIDI
-//       w = new MidiIOPrefs(mCategories);      mCategories->AddPage(w, 
w->GetName(), false, 0);
+#ifdef EXPERIMENTAL_MIDI_OUT
+         w = new MidiIOPrefs(mCategories);      mCategories->AddPage(w, 
w->GetName(), false, 0);
+#endif
          w = new QualityPrefs(mCategories);     mCategories->AddPage(w, 
w->GetName(), false, 0);
          w = new GUIPrefs(mCategories);         mCategories->AddPage(w, 
w->GetName(), false, 0);
          w = new TracksPrefs(mCategories);      mCategories->AddPage(w, 
w->GetName(), false, 0);

Index: MidiIOPrefs.h
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/prefs/MidiIOPrefs.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- MidiIOPrefs.h       28 Jun 2008 21:53:51 -0000      1.1
+++ MidiIOPrefs.h       24 Jun 2009 20:37:29 -0000      1.2
@@ -1,6 +1,3 @@
-#include "../Experimental.h"
-
-#ifdef EXPERIMENTAL_NOTE_TRACK
 /**********************************************************************
 
   Audacity: A Digital Audio Editor
@@ -12,46 +9,56 @@
 
 **********************************************************************/
 
+#include "../Experimental.h"
+#ifdef EXPERIMENTAL_MIDI_OUT
+
 #ifndef __AUDACITY_MIDI_IO_PREFS__
 #define __AUDACITY_MIDI_IO_PREFS__
 
-#include <wx/string.h>
-
-#include "PrefsPanel.h"
-
-class wxWindow;
-class wxCheckBox;
-class wxChoice;
 #include <wx/defs.h>
+
+#include <wx/choice.h>
 #include <wx/string.h>
+#include <wx/window.h>
 
-#include "PrefsPanel.h"
+#include "../ShuttleGui.h"
 
-class wxWindow;
-class ShuttleGui;
+#include "PrefsPanel.h"
 
-class MidiIOPrefs:public PrefsPanel 
+class MidiIOPrefs:public PrefsPanel
 {
-public:
+ public:
    MidiIOPrefs(wxWindow * parent);
-   ~MidiIOPrefs();
+   virtual ~MidiIOPrefs();
    virtual bool Apply();
 
-private:
+ private:
    void Populate();
-   void PopulateOrExchange( ShuttleGui & S );
+   void PopulateOrExchange(ShuttleGui & S);
    void GetNamesAndLabels();
 
-   wxArrayString mmPlayNames;
-   wxArrayString mmPlayLabels;
-   wxArrayString mmRecordNames;
-   wxArrayString mmRecordLabels;
-   wxArrayString mmChannelNames;
-   wxArrayInt    mmChannelLabels;
+   void OnHost(wxCommandEvent & e);
+//   void OnDevice(wxCommandEvent & e);
+
+   wxArrayString mHostNames;
+   wxArrayString mHostLabels;
+
+   wxString mPlayDevice;
+   wxString mRecordDevice;
+//   long mRecordChannels;
+
+   wxChoice *mHost;
+   wxChoice *mPlay;
+   wxChoice *mRecord;
+//   wxChoice *mChannels;
+
+   DECLARE_EVENT_TABLE();
 };
 
 #endif
 
+#endif
+
 // Indentation settings for Vim and Emacs and unique identifier for Arch, a
 // version control system. Please do not modify past this point.
 //
@@ -62,5 +69,3 @@
 //
 // vim: et sts=3 sw=3
 // arch-tag: df22b108-e989-4ec4-a8b6-dddbcc7be6a7
-
-#endif

Index: DevicePrefs.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/prefs/DevicePrefs.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- DevicePrefs.cpp     2 Jun 2009 06:12:55 -0000       1.3
+++ DevicePrefs.cpp     24 Jun 2009 20:37:29 -0000      1.4
@@ -117,7 +117,6 @@
          S.SetSizeHints(mHostNames);
 
          S.AddPrompt(_("Using:"));
-
          S.AddFixedText(wxString(Pa_GetVersionText(), wxConvLocal));
       }
       S.EndMultiColumn();

Index: MidiIOPrefs.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/prefs/MidiIOPrefs.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- MidiIOPrefs.cpp     6 Apr 2009 23:20:28 -0000       1.2
+++ MidiIOPrefs.cpp     24 Jun 2009 20:37:29 -0000      1.3
@@ -1,6 +1,3 @@
-#include "../Experimental.h"
-
-#ifdef EXPERIMENTAL_NOTE_TRACK
 /**********************************************************************
 
   Audacity: A Digital Audio Editor
@@ -18,7 +15,7 @@
 other settings.
 
   Presents interface for user to select the recording device and
-  playback device, from the list of choices that PortAudio
+  playback device, from the list of choices that PortMidi
   makes available.
 
   Also lets user decide whether or not to record in stereo, and
@@ -27,29 +24,56 @@
 *//********************************************************************/
 
 #include "../Audacity.h"
+#include "../Experimental.h"
+#ifdef EXPERIMENTAL_MIDI_OUT
+
 #include <wx/defs.h>
+
+#include <wx/choice.h>
 #include <wx/intl.h>
 
-#include "../Prefs.h"
+#include "portmidi.h"
+
 #include "../AudioIO.h"
-#include "../Project.h"
 #include "../Internat.h"
+#include "../Prefs.h"
+#include "../Project.h"
 #include "../ShuttleGui.h"
-#include "portmidi.h"
+
 #include "MidiIOPrefs.h"
 
-MidiIOPrefs::MidiIOPrefs(wxWindow * parent):
-   PrefsPanel(parent)
+enum {
+   HostID = 10000,
+   PlayID,
+   RecordID,
+   ChannelsID
+};
+
+BEGIN_EVENT_TABLE(MidiIOPrefs, PrefsPanel)
+   EVT_CHOICE(HostID, MidiIOPrefs::OnHost)
+//   EVT_CHOICE(RecordID, MidiIOPrefs::OnDevice)
+END_EVENT_TABLE()
+
+MidiIOPrefs::MidiIOPrefs(wxWindow * parent)
+:  PrefsPanel(parent, _("MIDI Devices"))
 {
-   SetLabel(_("Audio I/O"));         // Provide visual label
-   SetName(_("Audio I/O"));          // Provide audible label
    Populate();
 }
 
-void MidiIOPrefs::Populate( )
+MidiIOPrefs::~MidiIOPrefs()
+{
+}
+
+void MidiIOPrefs::Populate()
 {
    // First any pre-processing for constructing the GUI.
    GetNamesAndLabels();
+
+   // Get current setting for devices
+   mPlayDevice = gPrefs->Read(wxT("/MidiIO/PlaybackDevice"), wxT(""));
+   mRecordDevice = gPrefs->Read(wxT("/MidiIO/RecordingDevice"), wxT(""));
+//   mRecordChannels = gPrefs->Read(wxT("/MidiIO/RecordChannels"), 2L);
+
    //------------------------- Main section --------------------
    // Now construct the GUI itself.
    // Use 'eIsCreatingFromPrefs' so that the GUI is 
@@ -57,86 +81,90 @@
    ShuttleGui S(this, eIsCreatingFromPrefs);
    PopulateOrExchange(S);
    // ----------------------- End of main section --------------
-   // GUI is built, now do any post processing of it.
 
-   // Fit(); // JKC: Doesn't seem to make any difference...
+   wxCommandEvent e;
+   OnHost(e);
 }
 
 /// Gets the lists of names and lists of labels which are
 /// used in the choice controls.
 /// The names are what the user sees in the wxChoice.
 /// The corresponding labels are what gets stored.
-void MidiIOPrefs::GetNamesAndLabels()
-{
-   // Get lists of devices both for play and record.
-   int j;
-   wxString Name;
-   wxString Label;
-
+void MidiIOPrefs::GetNamesAndLabels() {
+   // Gather list of hosts.  Only added hosts that have devices attached.
    int nDevices = Pm_CountDevices();
-
-   for(j=0; j<nDevices; j++) {
-      const PmDeviceInfo* info = Pm_GetDeviceInfo(j);
-      Name = wxString( info->name, wxConvLocal );
-      Label = Name;
-      if (info->input > 0) {
-         mmPlayNames.Add( Name );
-         mmPlayLabels.Add( Label );
-      }
-      if (info->output > 0) {
-         mmRecordNames.Add( Name );
-         mmRecordLabels.Add( Label );
+   for (int i = 0; i < nDevices; i++) {
+      const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+      if (info->output || info->input) { //should always happen
+         wxString name(info->interf, wxConvLocal);
+         if (mHostNames.Index(name) == wxNOT_FOUND) {
+            mHostNames.Add(name);
+            mHostLabels.Add(name);
+         }
       }
    }
-
-   // Channel counts, mono, stereo etc...
-   const int numChannels = 16;
-   for(int c=0; c<numChannels; c++)
-   {
-      mmChannelNames.Add(  wxString::Format(wxT("%d"), c+1));
-      mmChannelLabels.Add( c+1 );
-   }
-   mmChannelNames[0] = wxString::Format(_("1 (Mono)"));
-   mmChannelNames[1] = wxString::Format(_("2 (Stereo)"));
 }
 
-void MidiIOPrefs::PopulateOrExchange( ShuttleGui & S )
-{
-   /// \todo
-   /// JKC: I think setting paths in gPrefs is bad practice.
-   /// Suppose we are using gPrefs from elsewhere at the same time?
-   /// Change these all to full paths?
-   gPrefs->SetPath(wxT("/MidiIO"));
+void MidiIOPrefs::PopulateOrExchange( ShuttleGui & S ) {
+   wxArrayString empty;
 
-   S.SetBorder( 2 );
+   S.SetBorder(2);
 
-   S.StartHorizontalLay(wxEXPAND, 0 );
-   S.StartStatic( _("Playback"),1 );
+   S.StartStatic(_("Interface"));
    {
-      S.StartMultiColumn(2, wxEXPAND);
-      S.SetStretchyCol(1);
-      S.TieChoice( _("Device") + wxString(wxT(":")), wxT("PlaybackDevice"), 
-         wxT(""), mmPlayNames, mmPlayLabels );
+      S.StartMultiColumn(2);
+      {
+         S.Id(HostID);
+         mHost = S.TieChoice(_("Host") + wxString(wxT(":")),
+                             wxT("/MidiIO/Host"), 
+                             wxT(""),
+                             mHostNames,
+                             mHostLabels);
+         S.SetSizeHints(mHostNames);
 
-      S.AddPrompt( _("Using:") );
-      wxString ver = _("Portaudio v");
-      ver += wxT("19");
-      S.AddFixedText( ver );
+         S.AddPrompt(_("Using:"));
+         S.AddFixedText(wxString(Pa_GetVersionText(), wxConvLocal));
+      }
       S.EndMultiColumn();
    }                              
    S.EndStatic();
-   S.StartStatic( _("Recording"), 1 );
+
+   S.StartStatic(_("Playback"));
    {
-      S.StartMultiColumn(2, wxEXPAND);
-      S.SetStretchyCol(1);
-      S.TieChoice( _("Device") + wxString(wxT(":")), wxT("RecordingDevice"), 
-         wxT(""), mmRecordNames, mmRecordLabels );
-      S.TieChoice( _("Channels") + wxString(wxT(":")), wxT("RecordChannels"), 
-         2, mmChannelNames, mmChannelLabels );
+      S.StartMultiColumn(2);
+      {
+         S.Id(PlayID);
+         mPlay = S.AddChoice(_("Device") + wxString(wxT(":")),
+                             wxEmptyString,
+                             &empty);
+      }
       S.EndMultiColumn();
    }
    S.EndStatic();
-   S.EndHorizontalLay();
+
+   S.StartStatic(_("Recording"));
+   {
+      S.StartMultiColumn(2);
+      {
+         S.Id(RecordID);
+         mRecord = S.AddChoice(_("Device") + wxString(wxT(":")),
+                               wxEmptyString,
+                               &empty);
+
+         S.Id(ChannelsID);
+         /*
+         mChannels = S.AddChoice(_("Channels") + wxString(wxT(":")),
+                                 wxEmptyString,
+                                 &empty);
+         */
+      }
+      S.EndMultiColumn();
+   }
+   S.EndStatic();
+}
+
+// Not sure that these settings are needed right now.
+#if 0
    S.StartStatic( _("Playthrough") );
    {
       S.TieCheckBox( _("&Play other tracks while recording new one"),
@@ -193,8 +221,7 @@
    }
 
    gPrefs->SetPath(wxT("/"));
-}
-
+#endif
 
 // JKC: This is some old code that was sizing control labels all the same, 
 // even if in different static controls.  It made for a nicer layout.
@@ -218,25 +245,171 @@
    }
 #endif
 
+void MidiIOPrefs::OnHost(wxCommandEvent & e)
+{
+   int index = mHost->GetCurrentSelection();
+   wxString itemAtIndex = mHostNames.Item(index);
+   int nDevices = Pm_CountDevices();
 
-MidiIOPrefs::~MidiIOPrefs()
+   if (nDevices == 0) {
+      mHost->Clear();
+      mHost->Append(_("No MIDI interfaces"), (void *) NULL);
+      mHost->SetSelection(0);
+   }
+
+   mPlay->Clear();
+   mRecord->Clear();
+
+   wxArrayString playnames;
+   wxArrayString recordnames;
+
+   for (int i = 0; i < nDevices; i++) {
+      const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+      if (itemAtIndex.IsSameAs(info->interf)) {
+         wxString name(info->name, wxConvLocal);
+         wxString device = wxString::Format(wxT("%s: %s"),
+                                            info->interf,
+                                            info->name);
+         int index;
+
+         if (info->output) {
+            playnames.Add(name);
+            index = mPlay->Append(name, (void *) info);
+            if (device == mPlayDevice) {
+               mPlay->SetSelection(index);
+            }
+         }
+
+         if (info->input) {
+            recordnames.Add(name);
+            index = mRecord->Append(name, (void *) info);
+            if (device == mRecordDevice) {
+               mRecord->SetSelection(index);
+            }
+         }
+      }
+   }
+
+   if (mPlay->GetCount() == 0) {
+      playnames.Add(_("No devices found"));
+      mPlay->Append(playnames[0], (void *) NULL);
+   }
+
+   if (mRecord->GetCount() == 0) {
+      recordnames.Add(_("No devices found"));
+      mRecord->Append(recordnames[0], (void *) NULL);
+   }
+
+   if (mPlay->GetCount() && mPlay->GetSelection() == wxNOT_FOUND) {
+      mPlay->SetSelection(0);
+   }
+
+   if (mRecord->GetCount() && mRecord->GetSelection() == wxNOT_FOUND) {
+      mRecord->SetSelection(0);
+   }
+
+   ShuttleGui S(this, eIsCreating);
+   S.SetSizeHints(mPlay, playnames);
+   S.SetSizeHints(mRecord, recordnames);
+//   OnDevice(e);
+}
+
+/*
+void MidiIOPrefs::OnDevice(wxCommandEvent & e)
 {
+   int ndx = mRecord->GetCurrentSelection();
+   if (ndx == wxNOT_FOUND) {
+      ndx = 0;
+   }
+
+   int sel = mChannels->GetSelection();
+   int cnt = 0;
+
+   const PmDeviceInfo *info = (const PmDeviceInfo *) 
mRecord->GetClientData(ndx);
+   if (info != NULL) {
+      cnt = info->input;
+   }
+
+   if (sel != wxNOT_FOUND) {
+      mRecordChannels = sel + 1;
+   }
+
+   mChannels->Clear();
+
+   // Limit cnt
+   cnt = cnt <= 0  ? 16  : cnt;
+   cnt = cnt > 256 ? 256 : cnt;
+      
+   wxArrayString channelnames;
+
+   // Channel counts, mono, stereo etc...
+   for (int i = 0; i < cnt; i++) {
+      wxString name;
+
+      if (i == 0) {
+         name = _("1 (Mono)");
+      }
+      else if (i == 1) {
+         name = _("2 (Stereo)");
+      }
+      else {
+         name = wxString::Format(wxT("%d"), i + 1);
+      }
+
+      channelnames.Add(name);
+      int index = mChannels->Append(name);
+      if (i == mRecordChannels - 1) {
+         mChannels->SetSelection(index);
+      }
+   }
+
+   if (mChannels->GetCount() && mChannels->GetCurrentSelection() == 
wxNOT_FOUND) {
+      mChannels->SetSelection(0);
+   }
+
+   ShuttleGui S(this, eIsCreating);
+   S.SetSizeHints(mChannels, channelnames);
+   Layout();
 }
+*/
 
 bool MidiIOPrefs::Apply()
 {
-   ShuttleGui S( this, eIsSavingToPrefs );
-   PopulateOrExchange( S );
+   ShuttleGui S(this, eIsSavingToPrefs);
+   PopulateOrExchange(S);
 
-#if USE_PORTMIXER
+   const PmDeviceInfo *info;
+
+   info = (const PmDeviceInfo *) mPlay->GetClientData(mPlay->GetSelection());
+   if (info) {
+      gPrefs->Write(wxT("/MidiIO/PlaybackDevice"),
+                    wxString::Format(wxT("%s: %s"),
+                                     info->interf,
+                                     info->name));
+   }
+
+   info = (const PmDeviceInfo *) 
mRecord->GetClientData(mRecord->GetSelection());
+   if (info) {
+      gPrefs->Write(wxT("/MidiIO/RecordingDevice"),
+                    wxString::Format(wxT("%s: %s"),
+                                     info->interf,
+                                     info->name));
+   }
+
+/*
+   gPrefs->Write(wxT("/MidiIO/RecordChannels"),
+                 wxString::Format(wxT("%d"),
+                                  mChannels->GetSelection() + 1));
+*/
+
+   #if USE_PORTMIXER
    if (gAudioIO)
       gAudioIO->HandleDeviceChange();
-#endif // USE_PORTMIXER
+   #endif // USE_PORTMIXER
 
    return true;
 }
 
-
 // Indentation settings for Vim and Emacs and unique identifier for Arch, a
 // version control system. Please do not modify past this point.
 //


------------------------------------------------------------------------------
_______________________________________________
Audacity-cvs mailing list
Audacity-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/audacity-cvs

Reply via email to