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

Modified Files:
        Experimental.h Menus.cpp Menus.h Project.cpp Project.h 
        TrackPanel.cpp TrackPanel.h 
Added Files:
        MixerBoard.cpp MixerBoard.h 
Log Message:
basic MixerBoard port from UmixIt. 

Lots of things to tweak yet. More commits later today.

Index: Project.h
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/Project.h,v
retrieving revision 1.158
retrieving revision 1.159
diff -u -d -r1.158 -r1.159
--- Project.h   7 Jul 2009 15:33:55 -0000       1.158
+++ Project.h   9 Jul 2009 23:52:18 -0000       1.159
@@ -65,6 +65,10 @@
 #ifdef EXPERIMENTAL_LYRICS_WINDOW
    class LyricsWindow;
 #endif
+#ifdef EXPERIMENTAL_MIXER_BOARD
+   class MixerBoard;
+   class MixerBoardFrame;
+#endif
 class Importer;
 class AdornedRulerPanel;
 
@@ -299,6 +303,9 @@
    #ifdef EXPERIMENTAL_LYRICS_WINDOW
       LyricsWindow* GetLyricsWindow() { return mLyricsWindow; };
    #endif
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      MixerBoard* GetMixerBoard() { return mMixerBoard; };
+   #endif
 
  public:
 
@@ -351,6 +358,9 @@
    #ifdef EXPERIMENTAL_LYRICS_WINDOW
       void UpdateLyrics();
    #endif
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      void UpdateMixerBoard();
+   #endif
    
    void GetRegionsByLabel( Regions &regions );
    
@@ -424,6 +434,10 @@
    #ifdef EXPERIMENTAL_LYRICS_WINDOW
       LyricsWindow* mLyricsWindow;
    #endif
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      MixerBoard* mMixerBoard;
+      MixerBoardFrame* mMixerBoardFrame;
+   #endif
 
 
  public:

--- NEW FILE: MixerBoard.h ---
/**********************************************************************

  Audacity: A Digital Audio Editor

  MixerBoard.h

  Vaughan Johnson, January 2007

**********************************************************************/

#include "Experimental.h"
#ifdef EXPERIMENTAL_MIXER_BOARD

#ifndef __AUDACITY_MIXER_BOARD__
#define __AUDACITY_MIXER_BOARD__

#include <wx/frame.h>
#include <wx/hashmap.h>
#include <wx/image.h>
#include <wx/panel.h>
#include <wx/scrolwin.h>
#include <wx/statbmp.h>
#include <wx/stattext.h>

#include "widgets/AButton.h"
#include "widgets/ASlider.h"
#include "widgets/Meter.h"

class AudacityProject;
class MixerBoard;
class WaveTrack;

// containment hierarchy: 
//    MixerBoardFrame -> MixerBoard -> MixerBoardScrolledWindow -> 
MixerTrackCluster(s)

class MixerTrackCluster : public wxPanel { 
public:
   MixerTrackCluster(wxWindow* parent, 
                     MixerBoard* grandParent, AudacityProject* project, 
                     WaveTrack* pLeftTrack, WaveTrack* pRightTrack = NULL, 
                     const wxPoint& pos = wxDefaultPosition, 
                     const wxSize& size = wxDefaultSize);
   ~MixerTrackCluster() {};

   void ResetMeter();

   void UpdateHeight(); // For wxSizeEvents, update gain slider and meter.

   // These are used by TrackPanel for synchronizing control states, etc.
   void UpdateName();
   void UpdateMute();
   void UpdateSolo();
   void UpdatePan();
   void UpdateGain();
   void UpdateMeter(double t1);

private:
   int GetGainToSliderValue();
   wxColour GetTrackColor();

   // event handlers
   void OnKeyEvent(wxKeyEvent& event);
   void OnMouseEvent(wxMouseEvent& event);
   void OnPaint(wxPaintEvent& evt);

   void OnButton_Mute(wxCommandEvent& event);
   void OnButton_Solo(wxCommandEvent& event);
   void OnSlider_Pan(wxCommandEvent& event);
   void OnSlider_Gain(wxCommandEvent& event);
   //v void OnSliderScroll_Gain(wxScrollEvent& event);

public:
   WaveTrack* mLeftTrack;
   WaveTrack* mRightTrack; // NULL if mono

private:
   MixerBoard* mMixerBoard;
   AudacityProject* mProject;

   // controls
   wxStaticText* mStaticText_TrackName;
   wxStaticBitmap* mStaticBitmap_MusicalInstrument;
   AButton* mToggleButton_Mute;
   AButton* mToggleButton_Solo;
   ASlider* mSlider_Pan;
   ASlider* mSlider_Gain;
   Meter* mMeter;

public:
   DECLARE_EVENT_TABLE()
};

WX_DEFINE_ARRAY(MixerTrackCluster*, MixerTrackClusterArray);


class MusicalInstrument {
public:
   MusicalInstrument(wxBitmap* pBitmap, const wxString strXPMfilename);
   ~MusicalInstrument();

   wxBitmap*      mBitmap;
   wxArrayString  mKeywords;
};
WX_DECLARE_OBJARRAY(MusicalInstrument, MusicalInstrumentArray);



// wxScrolledWindow ignores mouse clicks in client area, 
// but they don't get passed to Mixerboard.
// We need to catch them to deselect all track clusters.
class MixerBoardScrolledWindow : public wxScrolledWindow {
public: 
   MixerBoardScrolledWindow(AudacityProject* project, 
                              MixerBoard* parent, wxWindowID id = -1, 
                              const wxPoint& pos = wxDefaultPosition, 
                              const wxSize& size = wxDefaultSize, 
                              long style = wxHSCROLL | wxVSCROLL);
   ~MixerBoardScrolledWindow();

private:
   void OnMouseEvent(wxMouseEvent& event);

private: 
   MixerBoard* mMixerBoard;
   AudacityProject* mProject;

public:
   DECLARE_EVENT_TABLE()
};


class MixerBoardFrame;
class TrackList;

class MixerBoard : public wxWindow { 
   friend class MixerBoardFrame;

public:
   MixerBoard(AudacityProject* pProject, 
               wxFrame* parent, 
               const wxPoint& pos = wxDefaultPosition, 
               const wxSize& size = wxDefaultSize);
   ~MixerBoard();

   // Add clusters for any tracks we're not yet showing.
   // Update pointers for tracks we're aleady showing. 
   void UpdateTrackClusters(); 

   int GetTrackClustersWidth();
   void MoveTrackCluster(const WaveTrack* pLeftTrack, bool bUp); // Up in 
TrackPanel is left in MixerBoard.
   void RemoveTrackCluster(const WaveTrack* pLeftTrack);


   wxBitmap* GetMusicalInstrumentBitmap(const WaveTrack* pLeftTrack);

   bool HasSolo();
   void IncrementSoloCount(int nIncrement = 1);

   void RefreshTrackClusters();
   void ResetMeters();

   void UniquelyMuteOrSolo(const WaveTrack* pTargetLeftTrack, bool bSolo);

   void UpdateName(const WaveTrack* pLeftTrack);
   void UpdateMute(const WaveTrack* pLeftTrack = NULL); // NULL means update 
for all tracks.
   void UpdateSolo(const WaveTrack* pLeftTrack = NULL); // NULL means update 
for all tracks.
   void UpdatePan(const WaveTrack* pLeftTrack);
   void UpdateGain(const WaveTrack* pLeftTrack);
   
   void UpdateMeters(double t);

   void UpdateWidth();

private:
   void CreateMuteSoloImages();
   int FindMixerTrackCluster(const WaveTrack* pLeftTrack, 
                              MixerTrackCluster** hMixerTrackCluster) const;
   void LoadMusicalInstruments();

   // event handlers
   void OnSize(wxSizeEvent &evt);


public:
   // mute & solo button images: Create once and store on MixerBoard for use in 
all MixerTrackClusters.
   wxImage* mImageMuteUp;
   wxImage* mImageMuteOver;
   wxImage* mImageMuteDown;
   wxImage* mImageMuteDownWhileSolo; // the one actually alternate image
   wxImage* mImageMuteDisabled;
   wxImage* mImageSoloUp;
   wxImage* mImageSoloOver;
   wxImage* mImageSoloDown;
   wxImage* mImageSoloDisabled;

   int mMuteSoloWidth;

private:
   // Track clusters are maintained in the same order as the WaveTracks.
   MixerTrackClusterArray     mMixerTrackClusters; 

   MusicalInstrumentArray     mMusicalInstruments; 
   AudacityProject*           mProject;
   MixerBoardScrolledWindow*  mScrolledWindow; // Holds the MixerTrackClusters 
and handles scrolling.
   unsigned int               mSoloCount;
   double                     mT;
   TrackList*                 mTracks;

public:
   DECLARE_EVENT_TABLE()
};


class MixerBoardFrame : public wxFrame { 
public:
   MixerBoardFrame(AudacityProject* parent);
   ~MixerBoardFrame();
private:
   // event handlers
   void OnCloseWindow(wxCloseEvent &WXUNUSED(event));
   void OnMaximize(wxMaximizeEvent &event);
   void OnSize(wxSizeEvent &evt);

public:
   MixerBoard* mMixerBoard;

public:
   DECLARE_EVENT_TABLE()
};

#endif // __AUDACITY_MIXER_BOARD__

#endif // EXPERIMENTAL_MIXER_BOARD
Index: TrackPanel.h
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/TrackPanel.h,v
retrieving revision 1.137
retrieving revision 1.138
diff -u -d -r1.137 -r1.138
--- TrackPanel.h        2 Jul 2009 22:03:24 -0000       1.137
+++ TrackPanel.h        9 Jul 2009 23:52:18 -0000       1.138
@@ -26,18 +26,17 @@
 class wxMenu;
 class wxRect;
 
-class TrackList;
-class Track;
 class TrackPanel;
 class TrackArtist;
-class WaveTrack;
-class LabelTrack;
 class Ruler;
 class SnapManager;
 class AdornedRulerPanel;
 class LWSlider;
 class ControlToolBar; //Needed because state of controls can affect what gets 
drawn.
 class ToolsToolBar; //Needed because state of controls can affect what gets 
drawn.
+#ifdef EXPERIMENTAL_MIXER_BOARD
+   class MixerBoard;
+#endif
 class AudacityProject;
 
 class TrackPanelAx;
@@ -222,7 +221,9 @@
    void UpdateVRulerSize();
 
  private:
-
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      MixerBoard* GetMixerBoard();
+   #endif
    bool IsUnsafe();
    bool HandleLabelTrackMouseEvent(LabelTrack * lTrack, wxRect &r, 
wxMouseEvent & event);
    bool HandleTrackLocationMouseEvent(WaveTrack * track, wxRect &r, 
wxMouseEvent &event);

--- NEW FILE: MixerBoard.cpp ---
/**********************************************************************

  Audacity: A Digital Audio Editor

  MixerBoard.cpp

  Vaughan Johnson, January 2007
  Dominic Mazzoni

**********************************************************************/

#include "Experimental.h"
#ifdef EXPERIMENTAL_MIXER_BOARD

#include <math.h>

#include <wx/dcmemory.h>
#include <wx/arrimpl.cpp>
#include <wx/settings.h> // for wxSystemSettings::GetColour and 
wxSystemSettings::GetMetric
[...1266 lines suppressed...]

// event handlers
void MixerBoardFrame::OnCloseWindow(wxCloseEvent &WXUNUSED(event))
{
   this->Hide();
}

void MixerBoardFrame::OnMaximize(wxMaximizeEvent &event)
{
   // Update the size hints to show all tracks before skipping to let default 
handling happen.
   mMixerBoard->UpdateWidth();
   event.Skip();
}

void MixerBoardFrame::OnSize(wxSizeEvent &event)
{
   mMixerBoard->SetSize(this->GetClientSize());
}

#endif // EXPERIMENTAL_MIXER_BOARD
Index: Menus.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/Menus.cpp,v
retrieving revision 1.498
retrieving revision 1.499
diff -u -d -r1.498 -r1.499
--- Menus.cpp   9 Jul 2009 23:04:58 -0000       1.498
+++ Menus.cpp   9 Jul 2009 23:52:18 -0000       1.499
@@ -66,6 +66,9 @@
 #ifdef EXPERIMENTAL_LYRICS_WINDOW
    #include "LyricsWindow.h"
 #endif
+#ifdef EXPERIMENTAL_MIXER_BOARD
+   #include "MixerBoard.h"
+#endif
 #include "Internat.h"
 #include "FileFormats.h"
 #include "FreqWindow.h"
@@ -529,6 +532,9 @@
    #ifdef EXPERIMENTAL_LYRICS_WINDOW
       c->AddItem(wxT("Lyrics"), _("&Lyrics..."), FN(OnLyrics), 
LabelTracksExistFlag, LabelTracksExistFlag); 
    #endif
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      c->AddItem(wxT("MixerBoard"), _("&Mixer Board..."), FN(OnMixerBoard), 
WaveTracksExistFlag, WaveTracksExistFlag);
+   #endif
 
    c->AddSeparator();
 
@@ -3915,6 +3921,9 @@
    ModifyState();
    
    mTrackPanel->Refresh(false);
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      mMixerBoard->Refresh(false);
+   #endif
 }
 
 void AudacityProject::OnSelectCursorEnd()
@@ -4176,6 +4185,17 @@
       mLyricsWindow->Show();
    }
 #endif
+#ifdef EXPERIMENTAL_MIXER_BOARD
+   void AudacityProject::OnMixerBoard()
+   {
+      if (!mMixerBoardFrame)
+      {
+         mMixerBoardFrame = new MixerBoardFrame(this);
+         mMixerBoard = mMixerBoardFrame->mMixerBoard;
+      }
+      mMixerBoardFrame->Show();
+  }
+#endif
 
 void AudacityProject::OnPlotSpectrum()
 {
@@ -5142,6 +5162,10 @@
 
    while (t) {
       if (t->GetSelected()) {
+         #ifdef EXPERIMENTAL_MIXER_BOARD
+            if (t->GetKind() == Track::Wave)
+               mMixerBoard->RemoveTrackCluster((WaveTrack*)t);
+         #endif
          if (!f)
             f = l;         // Capture the track preceeding the first removed 
track
          t = iter.RemoveCurrent(true);
@@ -5171,6 +5195,9 @@
    PushState(_("Removed audio track(s)"), _("Remove Track"));
 
    mTrackPanel->Refresh(false);
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      mMixerBoard->Refresh(true);
+   #endif
 }
 
 //

Index: TrackPanel.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/TrackPanel.cpp,v
retrieving revision 1.463
retrieving revision 1.464
diff -u -d -r1.463 -r1.464
--- TrackPanel.cpp      7 Jul 2009 06:13:22 -0000       1.463
+++ TrackPanel.cpp      9 Jul 2009 23:52:18 -0000       1.464
@@ -191,6 +191,10 @@
    #include "Lyrics.h"
    #include "LyricsWindow.h"
 #endif
+#ifdef EXPERIMENTAL_MIXER_BOARD
+   #include "MixerBoard.h"
+#endif
+
 #include "NoteTrack.h"
 #include "Prefs.h"
 #include "Project.h"
@@ -826,6 +830,11 @@
          }
       }
    #endif
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      MixerBoard* pMixerBoard = p->GetMixerBoard();
+      if (pMixerBoard && (p->GetAudioIOToken() > 0))
+         pMixerBoard->UpdateMeters(gAudioIO->GetStreamTime());
+   #endif
 
    // Each time the loop, check to see if we were playing or
    // recording audio, but the stream has stopped.
@@ -836,6 +845,10 @@
 #endif
          ) {
       p->GetControlToolBar()->OnStop(dummyEvent);
+      #ifdef EXPERIMENTAL_MIXER_BOARD
+         if (pMixerBoard) 
+            pMixerBoard->ResetMeters();
+      #endif
    }
 
    // Next, check to see if we were playing or recording
@@ -1264,6 +1277,15 @@
    HandleCursor(mLastMouseEvent);
 }
 
+#ifdef EXPERIMENTAL_MIXER_BOARD
+   MixerBoard* TrackPanel::GetMixerBoard()
+   {
+      AudacityProject *p = (AudacityProject*)GetParent();
+      wxASSERT(p);
+      return p->GetMixerBoard();
+   }
+#endif
+
 /// Used to determine whether it is safe or not to perform certain
 /// edits at the moment.
 /// @return true if audio is being recorded or is playing.
@@ -3353,6 +3375,16 @@
    wxString name = toRemove->GetName();
    Track *partner = toRemove->GetLink();
 
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      if (toRemove->GetKind() == Track::Wave)
+      {
+         // Update mixer board displayed tracks.
+         MixerBoard* pMixerBoard = this->GetMixerBoard(); 
+         if (pMixerBoard)
+            pMixerBoard->RemoveTrackCluster((WaveTrack*)toRemove); // Will 
remove partner shown in same cluster.
+      }
+   #endif
+
    mTracks->Remove(toRemove, true);
    if (partner) {
       mTracks->Remove(partner, true);
@@ -3426,18 +3458,11 @@
    {      
       if (buttonRect.Contains(event.m_x, event.m_y)) 
       {
-         //v Disrupts workflow to have these on the stack, so no longer doing 
it.
-         //    For either, MakeParentPushState to make the track state dirty.
+         // For either, MakeParentPushState to make the track state dirty.
          if(solo)
-         {
             OnTrackSolo(event.ShiftDown(),t);
-            //v MakeParentPushState(_("Soloed track"), _("Solo"), true /* 
consolidate */);
-         }
          else
-         {
             OnTrackMute(event.ShiftDown(),t);
-            //v MakeParentPushState(_("Muted track"), _("Mute"), true /* 
consolidate */);
-         }
       }  
       SetCapturedTrack( NULL );
       // mTrackInfo.DrawMuteSolo(&dc, r, t, false, solo);
@@ -3496,16 +3521,29 @@
 
    float newValue = slider->Get();
    WaveTrack *link = (WaveTrack *)mTracks->GetLink(mCapturedTrack);
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      MixerBoard* pMixerBoard = this->GetMixerBoard(); // Update mixer board, 
too.
+   #endif
    
    if (pan) {
       ((WaveTrack *)mCapturedTrack)->SetPan(newValue);
       if (link)
          link->SetPan(newValue);
+
+      #ifdef EXPERIMENTAL_MIXER_BOARD
+         if (pMixerBoard) 
+            pMixerBoard->UpdatePan((WaveTrack*)mCapturedTrack);
+      #endif
    }
    else {
       ((WaveTrack *)mCapturedTrack)->SetGain(newValue);
       if (link)
          link->SetGain(newValue);
+
+      #ifdef EXPERIMENTAL_MIXER_BOARD
+         if (pMixerBoard) 
+            pMixerBoard->UpdateGain((WaveTrack*)mCapturedTrack);
+      #endif
    }
 
    RefreshTrack(mCapturedTrack);
@@ -3675,14 +3713,25 @@
       return;
    }
 
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      MixerBoard* pMixerBoard = this->GetMixerBoard(); // Update mixer board, 
too.
+   #endif
    wxString dir;
    if (event.m_y < mMoveUpThreshold || event.m_y < 0) {
       mTracks->MoveUp(mCapturedTrack);
       dir = _("up");
+      #ifdef EXPERIMENTAL_MIXER_BOARD
+         if (pMixerBoard)
+            pMixerBoard->MoveTrackCluster((WaveTrack*)mCapturedTrack, true);
+      #endif
    }
    else if (event.m_y > mMoveDownThreshold || event.m_y > 
GetRect().GetHeight()) {
       mTracks->MoveDown(mCapturedTrack);
       dir = _("down");
+      #ifdef EXPERIMENTAL_MIXER_BOARD
+         if (pMixerBoard)
+            pMixerBoard->MoveTrackCluster((WaveTrack*)mCapturedTrack, false);
+      #endif
    }
    else
    {
@@ -5968,6 +6017,16 @@
       }
    }
 
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      // Update mixer board, too.
+      MixerBoard* pMixerBoard = this->GetMixerBoard(); 
+      if (pMixerBoard) 
+      {
+         pMixerBoard->UpdateMute(); // Update for all tracks.
+         pMixerBoard->UpdateSolo(); // Update for all tracks.
+      }
+   #endif
+
    mAx->Updated();
    Refresh(false);
 }
@@ -6033,6 +6092,16 @@
       }
    }
 
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      // Update mixer board, too.
+      MixerBoard* pMixerBoard = this->GetMixerBoard(); 
+      if (pMixerBoard) 
+      {
+         pMixerBoard->UpdateMute(); // Update for all tracks.
+         pMixerBoard->UpdateSolo(); // Update for all tracks.
+      }
+   #endif
+
    mAx->Updated();
    Refresh(false);
 }
@@ -6570,7 +6639,14 @@
 void TrackPanel::OnMoveTrack(wxCommandEvent & event)
 {
    wxASSERT(event.GetId() == OnMoveUpID || event.GetId() == OnMoveDownID);
-   if (mTracks->Move(mPopupMenuTarget, OnMoveUpID == event.GetId())) {
+   bool bUp = (OnMoveUpID == event.GetId());
+   if (mTracks->Move(mPopupMenuTarget, bUp)) {
+      #ifdef EXPERIMENTAL_MIXER_BOARD
+         MixerBoard* pMixerBoard = this->GetMixerBoard(); // Update mixer 
board, too.
+         if (pMixerBoard)
+            pMixerBoard->MoveTrackCluster((WaveTrack*)mPopupMenuTarget, bUp);
+      #endif
+
       MakeParentPushState(wxString::Format(_("Moved '%s' %s"),
                                            mPopupMenuTarget->GetName().
                                            c_str(),
@@ -6610,6 +6686,13 @@
                                            _("Track Name"), defaultStr);
       if (newName != wxT(""))
          t->SetName(newName);
+
+      #ifdef EXPERIMENTAL_MIXER_BOARD
+         MixerBoard* pMixerBoard = this->GetMixerBoard();
+         if (pMixerBoard) 
+            pMixerBoard->UpdateName((WaveTrack*)t);
+      #endif
+
       MakeParentPushState(wxString::Format(_("Renamed '%s' to '%s'"),
                                            defaultStr.c_str(),
                                            newName.c_str()),

Index: Menus.h
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/Menus.h,v
retrieving revision 1.139
retrieving revision 1.140
diff -u -d -r1.139 -r1.140
--- Menus.h     7 Jul 2009 06:13:22 -0000       1.139
+++ Menus.h     9 Jul 2009 23:52:18 -0000       1.140
@@ -250,6 +250,9 @@
 #ifdef EXPERIMENTAL_LYRICS_WINDOW
    void OnLyrics();
 #endif
+#ifdef EXPERIMENTAL_MIXER_BOARD
+   void OnMixerBoard();
+#endif
 
 void OnPlotSpectrum();
 void OnContrast();

Index: Project.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/Project.cpp,v
retrieving revision 1.436
retrieving revision 1.437
diff -u -d -r1.436 -r1.437
--- Project.cpp 9 Jul 2009 08:14:09 -0000       1.436
+++ Project.cpp 9 Jul 2009 23:52:18 -0000       1.437
@@ -101,6 +101,9 @@
    #include "Lyrics.h"
    #include "LyricsWindow.h"
 #endif
+#ifdef EXPERIMENTAL_MIXER_BOARD
+   #include "MixerBoard.h"
+#endif
 #include "Internat.h"
 #include "import/Import.h"
 #include "LabelTrack.h"
@@ -660,6 +663,10 @@
      #ifdef EXPERIMENTAL_LYRICS_WINDOW
         mLyricsWindow(NULL),
      #endif
+     #ifdef EXPERIMENTAL_MIXER_BOARD
+        mMixerBoard(NULL),
+        mMixerBoardFrame(NULL),
+     #endif
      mToolManager(NULL),
      mAudioIOToken(-1),
      mIsDeleting(false),
@@ -3249,9 +3256,11 @@
    ModifyUndoMenus();
 
    UpdateMenus();
-
    #ifdef EXPERIMENTAL_LYRICS_WINDOW
-      UpdateLyrics();
+      this->UpdateLyrics();
+   #endif
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      this->UpdateMixerBoard();
    #endif
 }
 
@@ -3271,16 +3280,19 @@
 
    UpdateMenus();
    
+   // Some state pushes, like changing a track gain control (& probably 
others), 
+   // should not repopulate Lyrics Window and MixerBoard. 
+   // Others, such as deleting a label or adding a wave track, obviously do. 
+   // Could categorize these state changes, but for now...
+   // It's crucial to not do that repopulating during playback. 
+   //vvv These can be combined in the same conditional when both features are 
made non-experimental. 
    #ifdef EXPERIMENTAL_LYRICS_WINDOW
-      // Some state pushes, like changing a track gain control (& probably 
others), 
-      // should not repopulate Lyrics Window and MixerBoard. 
-      // Others, such as deleting a label or adding a wave track, obviously 
do. 
-      // Could categorize these state changes, but for now...
-      // It's crucial to not do that repopulating during playback. 
       if (!gAudioIO->IsStreamActive(GetAudioIOToken())) 
-      {
-         UpdateLyrics();
-      }
+         this->UpdateLyrics();
+   #endif
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      if (!gAudioIO->IsStreamActive(GetAudioIOToken())) 
+         this->UpdateMixerBoard();
    #endif
 
    if (GetTracksFitVerticallyZoomed())
@@ -3337,7 +3349,10 @@
 
    UpdateMenus();
    #ifdef EXPERIMENTAL_LYRICS_WINDOW
-      UpdateLyrics();
+      this->UpdateLyrics();
+   #endif
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      this->UpdateMixerBoard();
    #endif
 }
 
@@ -3352,7 +3367,10 @@
    mTrackPanel->Refresh(false);
    ModifyUndoMenus();
    #ifdef EXPERIMENTAL_LYRICS_WINDOW
-      UpdateLyrics();
+      this->UpdateLyrics();
+   #endif
+   #ifdef EXPERIMENTAL_MIXER_BOARD
+      this->UpdateMixerBoard();
    #endif
 }
 
@@ -3380,6 +3398,16 @@
    }
 #endif
 
+#ifdef EXPERIMENTAL_MIXER_BOARD
+   void AudacityProject::UpdateMixerBoard()
+   {
+      if (!mMixerBoard)
+         return;
+      mMixerBoard->UpdateTrackClusters();
+      mMixerBoard->UpdateMeters(gAudioIO->GetStreamTime()); 
+   }
+#endif
+
 //
 // Clipboard methods
 //

Index: Experimental.h
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/Experimental.h,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -d -r1.59 -r1.60
--- Experimental.h      7 Jul 2009 06:13:22 -0000       1.59
+++ Experimental.h      9 Jul 2009 23:52:18 -0000       1.60
@@ -130,6 +130,7 @@
 #endif
 
 #define EXPERIMENTAL_LYRICS_WINDOW //vvvvv Vaughan, 2009-07-06
+#define EXPERIMENTAL_MIXER_BOARD //vvvvv Vaughan, 2009-07-07
 
 #endif
 


------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Audacity-cvs mailing list
Audacity-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/audacity-cvs

Reply via email to