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 ®ions ); @@ -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