Audacity 3.2.0
Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
AudioSetupToolBar Class Referencefinal

A toolbar to allow easier changing of input and output devices . More...

#include <AudioSetupToolBar.h>

Inheritance diagram for AudioSetupToolBar:
[legend]
Collaboration diagram for AudioSetupToolBar:
[legend]

Public Member Functions

 AudioSetupToolBar (AudacityProject &project)
 Methods for AudioSetupToolBar. More...
 
virtual ~AudioSetupToolBar ()
 
void Create (wxWindow *parent) override
 
void UpdatePrefs () override
 
void UpdateSelectedPrefs (int) override
 
void DeinitChildren ()
 
void Populate () override
 
void Repaint (wxDC *dc) override
 
void EnableDisableButtons () override
 
void ReCreateButtons () override
 
void OnFocus (wxFocusEvent &event)
 
void OnAudioSetup (wxCommandEvent &event)
 
- Public Member Functions inherited from ToolBar
 ToolBar (AudacityProject &project, int type, const TranslatableString &label, const wxString &section, bool resizable=false)
 
virtual ~ToolBar ()
 
bool AcceptsFocus () const override
 
bool AcceptsFocusFromKeyboard () const override
 
virtual void SetToDefaultSize ()
 
virtual void Create (wxWindow *parent)
 
virtual void EnableDisableButtons ()=0
 
virtual void ReCreateButtons ()
 
void UpdatePrefs () override
 
virtual void RegenerateTooltips ()=0
 
int GetType ()
 
TranslatableString GetTitle ()
 
TranslatableString GetLabel ()
 
wxString GetSection ()
 
ToolDockGetDock ()
 
void SetLabel (const TranslatableString &label)
 
virtual void SetDocked (ToolDock *dock, bool pushed)
 
virtual bool Expose (bool show=true)
 
bool IsResizable () const
 
bool IsVisible () const
 
bool IsDocked () const
 
bool IsPositioned ()
 
void SetVisible (bool bVisible)
 
void SetPositioned ()
 
virtual int GetInitialWidth ()
 Resizable toolbars should implement these. More...
 
virtual int GetMinToolbarWidth ()
 
virtual wxSize GetDockedSize ()
 
wxSize GetSmartDockedSize ()
 
virtual void ResizingDone ()
 
- Public Member Functions inherited from wxPanelWrapper
 wxPanelWrapper ()
 
 wxPanelWrapper (wxWindow *parent, wxWindowID winid=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxTAB_TRAVERSAL|wxNO_BORDER, const TranslatableString &name=XO("Panel"))
 
bool Create (wxWindow *parent, wxWindowID winid=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxTAB_TRAVERSAL|wxNO_BORDER, const TranslatableString &name=XO("Panel"))
 
void SetLabel (const TranslatableString &label)
 
void SetName (const TranslatableString &name)
 
void SetToolTip (const TranslatableString &toolTip)
 
void SetName ()
 
- Public Member Functions inherited from wxTabTraversalWrapper< wxPanel >
 wxTabTraversalWrapper (Args &&... args)
 
 wxTabTraversalWrapper (const wxTabTraversalWrapper &)=delete
 
 wxTabTraversalWrapper (wxTabTraversalWrapper &&)=delete
 
wxTabTraversalWrapperoperator= (const wxTabTraversalWrapper &)=delete
 
wxTabTraversalWrapperoperator= (wxTabTraversalWrapper &&)=delete
 

Static Public Member Functions

static AudioSetupToolBarGet (AudacityProject &project)
 
static const AudioSetupToolBarGet (const AudacityProject &project)
 
- Static Public Member Functions inherited from ToolBar
static AButtonMakeButton (wxWindow *parent, teBmps eUp, teBmps eDown, teBmps eHilite, teBmps eDownHi, teBmps eStandardUp, teBmps eStandardDown, teBmps eDisabled, wxWindowID id, wxPoint placement, bool processdownevents, wxSize size)
 
static AButtonMakeButton (ToolBar *parent, teBmps eEnabledUp, teBmps eEnabledDown, teBmps eDisabled, int id, bool processdownevents, const TranslatableString &label)
 
static void MakeAlternateImages (AButton &button, int idx, teBmps eUp, teBmps eDown, teBmps eHilite, teBmps eDownHi, teBmps eStandardUp, teBmps eStandardDown, teBmps eDisabled, wxSize size)
 
static void SetButtonToolTip (AudacityProject &project, AButton &button, const ComponentInterfaceSymbol commands[], size_t nCommands)
 
static void MakeButtonBackgroundsSmall ()
 
static void MakeButtonBackgroundsLarge ()
 

Private Types

enum  { ID_AUDIO_SETUP_BUTTON = 12000 , BUTTON_COUNT }
 

Private Member Functions

void OnRescannedDevices (DeviceChangeMessage)
 
void OnMenu (wxCommandEvent &event)
 
bool ChangeHost (int hostId)
 
void ChangeDevice (int deviceId, bool isInput)
 
void RepopulateMenus ()
 
void FillHosts ()
 
void FillHostDevices ()
 
void FillInputChannels ()
 
void SetDevices (const DeviceSourceMap *in, const DeviceSourceMap *out)
 
void RegenerateTooltips () override
 
void MakeAudioSetupButton ()
 
void ArrangeButtons ()
 
std::unique_ptr< wxMenu > CloneMenu (const wxMenu &menu) const
 
void AppendSubMenu (wxMenu &menu, const std::unique_ptr< wxMenu > &submenu, const wxString &title)
 
std::optional< wxString > GetSelectedRadioItemLabel (const wxMenu &menu) const
 

Private Attributes

AButtonmAudioSetup {}
 
wxBoxSizer * mSizer {}
 
std::unique_ptr< wxMenu > mInput
 
std::unique_ptr< wxMenu > mOutput
 
std::unique_ptr< wxMenu > mInputChannels
 
std::unique_ptr< wxMenu > mHost
 
Observer::Subscription mSubscription
 

Additional Inherited Members

- Public Types inherited from ToolBar
using Holder = wxWindowPtr< ToolBar >
 
- Protected Member Functions inherited from ToolBar
void SetButton (bool down, AButton *button)
 
wxBoxSizer * GetSizer ()
 
void Add (wxWindow *window, int proportion=0, int flag=wxALIGN_TOP, int border=0, wxObject *userData=NULL)
 
void Add (wxSizer *sizer, int proportion=0, int flag=0, int border=0, wxObject *userData=NULL)
 
void Add (int width, int height, int proportion=0, int flag=0, int border=0, wxObject *userData=NULL)
 
void AddSpacer (int size=14)
 
void AddStretchSpacer (int prop=1)
 
void Detach (wxWindow *window)
 
void Detach (wxSizer *sizer)
 
void Updated ()
 
int GetResizeGrabberWidth ()
 Returns the width in pixels of the resizer element. More...
 
virtual void Populate ()=0
 
virtual void Repaint (wxDC *dc)=0
 
void OnErase (wxEraseEvent &event)
 
void OnPaint (wxPaintEvent &event)
 
void OnMouseEvents (wxMouseEvent &event)
 
virtual void UpdateSelectedPrefs (int id)
 
 PrefsListener ()
 
virtual ~PrefsListener ()
 
virtual void UpdatePrefs ()=0
 
- Static Protected Member Functions inherited from ToolBar
static void MakeMacRecoloredImage (teBmps eBmpOut, teBmps eBmpIn)
 
static void MakeMacRecoloredImageSize (teBmps eBmpOut, teBmps eBmpIn, const wxSize &size)
 
static void MakeRecoloredImage (teBmps eBmpOut, teBmps eBmpIn)
 
static void MakeRecoloredImageSize (teBmps eBmpOut, teBmps eBmpIn, const wxSize &size)
 
- Static Protected Member Functions inherited from PrefsListener
static void Broadcast (int id=0)
 Call this static function to notify all PrefsListener objects. More...
 
- Protected Attributes inherited from ToolBar
AudacityProjectmProject
 
TranslatableString mLabel
 
wxString mSection
 
int mType
 

Detailed Description

A toolbar to allow easier changing of input and output devices .

Definition at line 25 of file AudioSetupToolBar.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
private
Enumerator
ID_AUDIO_SETUP_BUTTON 
BUTTON_COUNT 

Definition at line 69 of file AudioSetupToolBar.h.

Constructor & Destructor Documentation

◆ AudioSetupToolBar()

AudioSetupToolBar::AudioSetupToolBar ( AudacityProject project)
explicit

Methods for AudioSetupToolBar.

Definition at line 83 of file AudioSetupToolBar.cpp.

84: ToolBar( project, AudioSetupBarID, XO("Audio Setup"), wxT("Audio Setup") )
85{
88}
wxT("CloseDown"))
#define XO(s)
Definition: Internat.h:31
@ AudioSetupBarID
Definition: ToolBar.h:85
void OnRescannedDevices(DeviceChangeMessage)
Observer::Subscription mSubscription
static DeviceManager * Instance()
Gets the singleton instance.
Subscription Subscribe(Callback callback)
Connect a callback to the Publisher; later-connected are called earlier.
Definition: Observer.h:199
ToolBar(AudacityProject &project, int type, const TranslatableString &label, const wxString &section, bool resizable=false)
Definition: ToolBar.cpp:330

References DeviceManager::Instance(), OnRescannedDevices(), and Observer::Publisher< Message, NotifyAll >::Subscribe().

Here is the call graph for this function:

◆ ~AudioSetupToolBar()

AudioSetupToolBar::~AudioSetupToolBar ( )
virtual

Definition at line 90 of file AudioSetupToolBar.cpp.

91{
92}

Member Function Documentation

◆ AppendSubMenu()

void AudioSetupToolBar::AppendSubMenu ( wxMenu &  menu,
const std::unique_ptr< wxMenu > &  submenu,
const wxString &  title 
)
private

Definition at line 629 of file AudioSetupToolBar.cpp.

630{
631 auto clone = CloneMenu(*submenu);
632 auto menuItem = menu.AppendSubMenu(clone.release(), title);
633
634 const auto selected = GetSelectedRadioItemLabel(*submenu);
635 if (!selected) {
636 menuItem->Enable(false);
637 }
638}
static const auto title
std::optional< wxString > GetSelectedRadioItemLabel(const wxMenu &menu) const
std::unique_ptr< wxMenu > CloneMenu(const wxMenu &menu) const

References CloneMenu(), GetSelectedRadioItemLabel(), and title.

Referenced by OnAudioSetup().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ArrangeButtons()

void AudioSetupToolBar::ArrangeButtons ( )
private

Definition at line 170 of file AudioSetupToolBar.cpp.

171{
172 int flags = wxALIGN_CENTER | wxRIGHT;
173
174 // (Re)allocate the button sizer
175 if (mSizer)
176 {
177 Detach(mSizer);
178 std::unique_ptr < wxSizer > {mSizer}; // DELETE it
179 }
180
181 Add((mSizer = safenew wxBoxSizer(wxHORIZONTAL)), 1, wxEXPAND);
182 mSizer->Add(mAudioSetup, 1, wxEXPAND);
183
184 // Layout the sizer
185 mSizer->Layout();
186
187 // Layout the toolbar
188 Layout();
189
190 SetMinSize(GetSizer()->GetMinSize());
191}
#define safenew
Definition: MemoryX.h:10
void Add(wxWindow *window, int proportion=0, int flag=wxALIGN_TOP, int border=0, wxObject *userData=NULL)
Definition: ToolBar.cpp:695
wxBoxSizer * GetSizer()
Definition: ToolBar.cpp:687
void Detach(wxWindow *window)
Definition: ToolBar.cpp:761

References ToolBar::Add(), ToolBar::Detach(), ToolBar::GetSizer(), mAudioSetup, mSizer, and safenew.

Referenced by Populate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ChangeDevice()

void AudioSetupToolBar::ChangeDevice ( int  deviceId,
bool  isInput 
)
private

Definition at line 710 of file AudioSetupToolBar.cpp.

711{
712 int newIndex = -1;
713 auto& device = isInput ? mInput : mOutput;
714
715 auto host = AudioIOHost.Read();
716 const std::vector<DeviceSourceMap>& maps = isInput ? DeviceManager::Instance()->GetInputDeviceMaps()
718
719 auto item = device->FindChildItem(deviceId);
720 if (item) {
721 // Update cache with the chosen device
722 item->Check();
723 wxString newDevice = item->GetItemLabelText();
724
725 for (size_t i = 0; i < maps.size(); ++i) {
726 wxString name = MakeDeviceSourceString(&maps[i]);
727 if (name == newDevice && maps[i].hostString == host) {
728 newIndex = i;
729 }
730 }
731 }
732
733 if (newIndex < 0) {
734 wxLogDebug(wxT("AudioSetupToolBar::OnMenu(): couldn't find device indices"));
735 return;
736 }
737
738 SetDevices(isInput ? &maps[newIndex] : nullptr,
739 isInput ? nullptr : &maps[newIndex]);
740}
StringSetting AudioIOHost
wxString MakeDeviceSourceString(const DeviceSourceMap *map)
const TranslatableString name
Definition: Distortion.cpp:82
void SetDevices(const DeviceSourceMap *in, const DeviceSourceMap *out)
std::unique_ptr< wxMenu > mInput
std::unique_ptr< wxMenu > mOutput
const std::vector< DeviceSourceMap > & GetInputDeviceMaps()
const std::vector< DeviceSourceMap > & GetOutputDeviceMaps()
bool Read(T *pVar) const
overload of Read returning a boolean that is true if the value was previously defined *‍/
Definition: Prefs.h:200

References AudioIOHost, DeviceManager::GetInputDeviceMaps(), DeviceManager::GetOutputDeviceMaps(), DeviceManager::Instance(), MakeDeviceSourceString(), mInput, mOutput, name, Setting< T >::Read(), SetDevices(), and wxT().

Referenced by OnMenu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ChangeHost()

bool AudioSetupToolBar::ChangeHost ( int  hostId)
private

Definition at line 660 of file AudioSetupToolBar.cpp.

661{
662 auto item = mHost->FindChildItem(hostId);
663 if (!item)
664 return false;
665
666 // Update cache with selected host
667 item->Check();
668
669 auto oldHost = AudioIOHost.Read();
670 wxString newHost = item->GetItemLabelText();
671
672 if (oldHost == newHost)
673 return false;
674
675 //change the host and switch to correct devices.
676 AudioIOHost.Write(newHost);
677 gPrefs->Flush();
678
679 // populate the devices
681
682 return true;
683}
FileConfig * gPrefs
Definition: Prefs.cpp:71
std::unique_ptr< wxMenu > mHost
virtual bool Flush(bool bCurrentOnly=false) wxOVERRIDE
Definition: FileConfig.cpp:143
bool Write(const T &value)
Write value to config and return true if successful.
Definition: Prefs.h:252

References AudioIOHost, FillHostDevices(), FileConfig::Flush(), gPrefs, mHost, Setting< T >::Read(), and Setting< T >::Write().

Referenced by OnMenu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CloneMenu()

std::unique_ptr< wxMenu > AudioSetupToolBar::CloneMenu ( const wxMenu &  menu) const
private

Definition at line 615 of file AudioSetupToolBar.cpp.

616{
617 auto clonedMenu = std::make_unique<wxMenu>();
618
619 for (const auto& item : menu.GetMenuItems()) {
620 auto cloneMenuItem = clonedMenu->AppendRadioItem(item->GetId(), item->GetItemLabelText());
621
622 if (item->IsChecked())
623 cloneMenuItem->Check();
624 }
625
626 return clonedMenu;
627}

Referenced by AppendSubMenu().

Here is the caller graph for this function:

◆ Create()

void AudioSetupToolBar::Create ( wxWindow *  parent)
overridevirtual

Reimplemented from ToolBar.

Definition at line 105 of file AudioSetupToolBar.cpp.

106{
107 ToolBar::Create(parent);
108
109 // Simulate a size event to set initial meter placement/size
110 wxSizeEvent event(GetSize(), GetId());
111 event.SetEventObject(this);
112 GetEventHandler()->ProcessEvent(event);
113}
virtual void Create(wxWindow *parent)
Definition: ToolBar.cpp:484

References ToolBar::Create().

Here is the call graph for this function:

◆ DeinitChildren()

void AudioSetupToolBar::DeinitChildren ( )

Definition at line 115 of file AudioSetupToolBar.cpp.

116{
117 mInput.reset();
118 mOutput.reset();
119 mInputChannels.reset();
120 mHost.reset();
121}
std::unique_ptr< wxMenu > mInputChannels

References mHost, mInput, mInputChannels, and mOutput.

Referenced by Populate().

Here is the caller graph for this function:

◆ EnableDisableButtons()

void AudioSetupToolBar::EnableDisableButtons ( )
overridevirtual

Implements ToolBar.

Definition at line 396 of file AudioSetupToolBar.cpp.

397{
398 auto gAudioIO = AudioIOBase::Get();
399 if (gAudioIO) {
400 // we allow changes when monitoring, but not when recording
401 bool audioStreamActive = gAudioIO->IsStreamActive() && !gAudioIO->IsMonitoring();
402
403 if (audioStreamActive) {
405 }
406 else {
408 }
409 }
410}
void Disable()
Definition: AButton.cpp:563
void Enable()
Definition: AButton.cpp:554
static AudioIOBase * Get()
Definition: AudioIOBase.cpp:91

References AButton::Disable(), AButton::Enable(), AudioIOBase::Get(), and mAudioSetup.

Referenced by ReCreateButtons().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FillHostDevices()

void AudioSetupToolBar::FillHostDevices ( )
private

Definition at line 476 of file AudioSetupToolBar.cpp.

477{
478 const std::vector<DeviceSourceMap> &inMaps = DeviceManager::Instance()->GetInputDeviceMaps();
479 const std::vector<DeviceSourceMap> &outMaps = DeviceManager::Instance()->GetOutputDeviceMaps();
480
481 //read what is in the prefs
482 auto host = AudioIOHost.Read();
483 int foundHostIndex = -1;
484
485 // if the host is not in the hosts combo then we rescanned.
486 // set it to blank so we search for another host.
487 if (mHost->FindItem(host) == wxNOT_FOUND) {
488 host = wxT("");
489 }
490
491 for (auto & device : outMaps) {
492 if (device.hostString == host) {
493 foundHostIndex = device.hostIndex;
494 break;
495 }
496 }
497
498 if (foundHostIndex == -1) {
499 for (auto & device : inMaps) {
500 if (device.hostString == host) {
501 foundHostIndex = device.hostIndex;
502 break;
503 }
504 }
505 }
506
507 // If no host was found based on the prefs device host, load the first available one
508 if (foundHostIndex == -1) {
509 if (outMaps.size()) {
510 foundHostIndex = outMaps[0].hostIndex;
511 }
512 else if (inMaps.size()) {
513 foundHostIndex = inMaps[0].hostIndex;
514 }
515 }
516
517 // Make sure in/out are clear in case no host was found
518 mInput = std::make_unique<wxMenu>();
519 mOutput = std::make_unique<wxMenu>();
520
521 // If we still have no host it means no devices, in which case do nothing.
522 if (foundHostIndex == -1) {
523 return;
524 }
525
526 // Repopulate the Input/Output device list available to the user
527 for (int nextMenuId = kInput, i = 0; i < inMaps.size(); ++i) {
528 auto& device = inMaps[i];
529
530 if (foundHostIndex == device.hostIndex) {
531 mInput->AppendRadioItem(nextMenuId, MakeDeviceSourceString(&device));
532 nextMenuId++;
533
534 if (host.empty()) {
535 host = device.hostString;
536 AudioIOHost.Write(host);
537
538 const auto id = mHost->FindItem(host);
539 if (id != wxNOT_FOUND) {
540 mHost->FindChildItem(id)->Check();
541 }
542 }
543 }
544 }
545
546 for (int nextMenuId = kOutput, i = 0; i < outMaps.size(); ++i) {
547 auto& device = outMaps[i];
548
549 if (foundHostIndex == device.hostIndex) {
550 mOutput->AppendRadioItem(nextMenuId, MakeDeviceSourceString(&device));
551 nextMenuId++;
552
553 if (host.empty()) {
554 host = device.hostString;
555 AudioIOHost.Write(host);
556 gPrefs->Flush();
557
558 const auto id = mHost->FindItem(host);
559 if (id != wxNOT_FOUND) {
560 mHost->FindChildItem(id)->Check();
561 }
562 }
563 }
564 }
565
566 // The setting of the Device is left up to OnMenu
567}

References AudioIOHost, FileConfig::Flush(), DeviceManager::GetInputDeviceMaps(), DeviceManager::GetOutputDeviceMaps(), gPrefs, DeviceManager::Instance(), anonymous_namespace{AudioSetupToolBar.cpp}::kInput, anonymous_namespace{AudioSetupToolBar.cpp}::kOutput, MakeDeviceSourceString(), mHost, mInput, mOutput, Setting< T >::Read(), Setting< T >::Write(), and wxT().

Referenced by ChangeHost(), RepopulateMenus(), and UpdatePrefs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FillHosts()

void AudioSetupToolBar::FillHosts ( )
private

Definition at line 449 of file AudioSetupToolBar.cpp.

450{
451 const std::vector<DeviceSourceMap> &inMaps = DeviceManager::Instance()->GetInputDeviceMaps();
452 const std::vector<DeviceSourceMap> &outMaps = DeviceManager::Instance()->GetOutputDeviceMaps();
453
454 wxArrayString hosts;
455
456 // go over our lists add the host to the list if it isn't there yet
457
458 for (auto & device : inMaps) {
459 if (!make_iterator_range(hosts).contains(device.hostString)) {
460 hosts.push_back(device.hostString);
461 }
462 }
463
464 for (auto & device : outMaps) {
465 if (!make_iterator_range(hosts).contains(device.hostString)) {
466 hosts.push_back(device.hostString);
467 }
468 }
469
470 mHost = std::make_unique<wxMenu>();
471
472 for (int i = 0; i < hosts.size(); ++i)
473 mHost->AppendRadioItem(kHost + i, hosts[i]);
474}
IteratorRange< Iterator > make_iterator_range(const Iterator &i1, const Iterator &i2)
Definition: MemoryX.h:431

References DeviceManager::GetInputDeviceMaps(), DeviceManager::GetOutputDeviceMaps(), DeviceManager::Instance(), anonymous_namespace{AudioSetupToolBar.cpp}::kHost, make_iterator_range(), and mHost.

Referenced by RepopulateMenus().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FillInputChannels()

void AudioSetupToolBar::FillInputChannels ( )
private

Definition at line 569 of file AudioSetupToolBar.cpp.

570{
571 const std::vector<DeviceSourceMap> &inMaps = DeviceManager::Instance()->GetInputDeviceMaps();
572 auto host = AudioIOHost.Read();
573 auto device = AudioIORecordingDevice.Read();
574 auto source = AudioIORecordingSource.Read();
575 long newChannels;
576
577 auto oldChannels = AudioIORecordChannels.Read();
578 mInputChannels = std::make_unique<wxMenu>();
579
580 for (auto & dev: inMaps) {
581 if (source == dev.sourceString &&
582 device == dev.deviceString &&
583 host == dev.hostString) {
584
585 // add one selection for each channel of this source
586 for (size_t j = 0; j < (unsigned int)dev.numChannels; j++) {
587 wxString name;
588
589 if (j == 0) {
590 name = _("1 (Mono) Recording Channel");
591 }
592 else if (j == 1) {
593 name = _("2 (Stereo) Recording Channels");
594 }
595 else {
596 name = wxString::Format(wxT("%d"), (int)j + 1);
597 }
598 mInputChannels->AppendRadioItem(kInputChannels + j, name);
599 }
600 newChannels = dev.numChannels;
601 if (oldChannels <= newChannels && oldChannels >= 1) {
602 newChannels = oldChannels;
603 }
604 if (newChannels >= 1) {
605 auto item = mInputChannels->FindItem(kInputChannels + newChannels - 1);
606 if (item != nullptr)
607 item->Check();
608 }
609 AudioIORecordChannels.Write(newChannels);
610 break;
611 }
612 }
613}
StringSetting AudioIORecordingSource
StringSetting AudioIORecordingDevice
IntSetting AudioIORecordChannels
#define _(s)
Definition: Internat.h:75

References _, AudioIOHost, AudioIORecordChannels, AudioIORecordingDevice, AudioIORecordingSource, DeviceManager::GetInputDeviceMaps(), DeviceManager::Instance(), anonymous_namespace{AudioSetupToolBar.cpp}::kInputChannels, mInputChannels, name, Setting< T >::Read(), Setting< T >::Write(), and wxT().

Referenced by RepopulateMenus(), SetDevices(), and UpdatePrefs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Get() [1/2]

AudioSetupToolBar & AudioSetupToolBar::Get ( AudacityProject project)
static

Definition at line 94 of file AudioSetupToolBar.cpp.

95{
96 auto &toolManager = ToolManager::Get( project );
97 return *static_cast<AudioSetupToolBar*>( toolManager.GetToolBar(AudioSetupBarID) );
98}
A toolbar to allow easier changing of input and output devices .
static ToolManager & Get(AudacityProject &project)

References AudioSetupBarID, and ToolManager::Get().

Referenced by Get().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Get() [2/2]

const AudioSetupToolBar & AudioSetupToolBar::Get ( const AudacityProject project)
static

Definition at line 100 of file AudioSetupToolBar.cpp.

101{
102 return Get( const_cast<AudacityProject&>( project )) ;
103}
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:89
static AudioSetupToolBar & Get(AudacityProject &project)

References Get().

Here is the call graph for this function:

◆ GetSelectedRadioItemLabel()

std::optional< wxString > AudioSetupToolBar::GetSelectedRadioItemLabel ( const wxMenu &  menu) const
private

Definition at line 640 of file AudioSetupToolBar.cpp.

641{
642 const auto& items = menu.GetMenuItems();
643
644 for (const auto& item : items) {
645 if (item->IsChecked())
646 return item->GetItemLabelText();
647 }
648
649 return std::nullopt;
650}

Referenced by AppendSubMenu(), and UpdatePrefs().

Here is the caller graph for this function:

◆ MakeAudioSetupButton()

void AudioSetupToolBar::MakeAudioSetupButton ( )
private

Definition at line 154 of file AudioSetupToolBar.cpp.

155{
157 //i18n-hint: Audio setup button text, keep as short as possible
158 mAudioSetup->SetLabel(XO("Audio Setup"));
161 theTheme.Image(bmpRecoloredUpSmall),
162 theTheme.Image(bmpRecoloredUpHiliteSmall),
163 theTheme.Image(bmpRecoloredDownSmall),
164 theTheme.Image(bmpRecoloredHiliteSmall),
165 theTheme.Image(bmpRecoloredUpSmall));
166 mAudioSetup->SetIcon(theTheme.Image(bmpSetup));
167 mAudioSetup->SetForegroundColour(theTheme.Colour(clrTrackPanelText));
168}
THEME_API Theme theTheme
Definition: Theme.cpp:82
A wxButton with mouse-over behaviour.
Definition: AButton.h:104
void SetButtonType(Type type)
Definition: AButton.cpp:150
void SetImages(const wxImage &up, const wxImage &over, const wxImage &down, const wxImage &overDown, const wxImage &dis)
Definition: AButton.cpp:208
@ FrameButton
Definition: AButton.h:114
void SetIcon(const wxImage &icon)
Definition: AButton.cpp:229
void SetLabel(const TranslatableString &label)
Definition: AButton.cpp:192
wxColour & Colour(int iIndex)
wxImage & Image(int iIndex)

References ThemeBase::Colour(), AButton::FrameButton, ID_AUDIO_SETUP_BUTTON, ThemeBase::Image(), mAudioSetup, safenew, AButton::SetButtonType(), AButton::SetIcon(), AButton::SetImages(), AButton::SetLabel(), theTheme, and XO.

Referenced by Populate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnAudioSetup()

void AudioSetupToolBar::OnAudioSetup ( wxCommandEvent &  event)

Definition at line 226 of file AudioSetupToolBar.cpp.

227{
228 wxMenu menu;
229
230 //i18n-hint: Audio setup menu
231 AppendSubMenu(menu, mHost, _("&Host"));
232 menu.AppendSeparator();
233
234 //i18n-hint: Audio setup menu
235 AppendSubMenu(menu, mOutput, _("&Playback Device"));
236 menu.AppendSeparator();
237
238 //i18n-hint: Audio setup menu
239 AppendSubMenu(menu, mInput, _("&Recording Device"));
240 menu.AppendSeparator();
241
242 //i18n-hint: Audio setup menu
243 AppendSubMenu(menu, mInputChannels, _("Recording &Channels"));
244 menu.AppendSeparator();
245 menu.Append(kAudioSettings, _("&Audio Settings..."));
246
247 menu.Bind(wxEVT_MENU_CLOSE, [this](auto&) { mAudioSetup->PopUp(); });
248 menu.Bind(wxEVT_MENU, &AudioSetupToolBar::OnMenu, this);
249
250 wxWindow* btn = FindWindow(ID_AUDIO_SETUP_BUTTON);
251 wxRect r = btn->GetRect();
252 BasicMenu::Handle{ &menu }.Popup(
254 { r.GetLeft(), r.GetBottom() }
255 );
256}
void PopUp()
Definition: AButton.cpp:588
void OnMenu(wxCommandEvent &event)
void AppendSubMenu(wxMenu &menu, const std::unique_ptr< wxMenu > &submenu, const wxString &title)
void Popup(const BasicUI::WindowPlacement &window, const Point &pos={})
Display the menu at pos, invoke at most one action, then hide it.
Definition: BasicMenu.cpp:209
Window placement information for wxWidgetsBasicUI can be constructed from a wxWindow pointer.

References _, AppendSubMenu(), ID_AUDIO_SETUP_BUTTON, anonymous_namespace{AudioSetupToolBar.cpp}::kAudioSettings, mAudioSetup, mHost, mInput, mInputChannels, mOutput, OnMenu(), AButton::PopUp(), and BasicMenu::Handle::Popup().

Here is the call graph for this function:

◆ OnFocus()

void AudioSetupToolBar::OnFocus ( wxFocusEvent &  event)

Definition at line 221 of file AudioSetupToolBar.cpp.

222{
223 KeyboardCapture::OnFocus( *this, event );
224}
void OnFocus(wxWindow &window, wxFocusEvent &event)
a function useful to implement a focus event handler The window releases the keyboard if the event is...

References KeyboardCapture::OnFocus().

Here is the call graph for this function:

◆ OnMenu()

void AudioSetupToolBar::OnMenu ( wxCommandEvent &  event)
private

Definition at line 742 of file AudioSetupToolBar.cpp.

743{
744 int id = event.GetId();
745 bool audioSettingsChosen = false;
746
747 if ((id >= kHost) && (id < kInput)) {
748 ChangeHost(id);
749 }
750 else if ((id >= kInputChannels) && (id < kOutput)) {
751 if (auto item = mInputChannels->FindChildItem(id)) {
752 // Update cache with selected number of input channels
753 item->Check();
755 }
756 }
757 else if ((id >= kInput) && (id < kInputChannels)) {
758 ChangeDevice(id, true);
759 }
760 else if ((id >= kOutput) && (id < kAudioSettings)) {
761 ChangeDevice(id, false);
762 }
763 else if (id == kAudioSettings) {
764 audioSettingsChosen = true;
765 }
766
767 auto gAudioIO = AudioIOBase::Get();
768 if (gAudioIO) {
769 // We cannot have gotten here if gAudioIO->IsAudioTokenActive(),
770 // per the setting of AudioIONotBusyFlag and AudioIOBusyFlag in
771 // AudacityProject::GetUpdateFlags().
772 // However, we can have an invalid audio token (so IsAudioTokenActive()
773 // is false), but be monitoring.
774 // If monitoring, have to stop the stream, so HandleDeviceChange() can work.
775 // We could disable the Preferences command while monitoring, i.e.,
776 // set AudioIONotBusyFlag/AudioIOBusyFlag according to monitoring, as well.
777 // Instead allow it because unlike recording, for example, monitoring
778 // is not clearly something that should prohibit changing device.
779 // TODO: We *could* be smarter in this method and call HandleDeviceChange()
780 // only when the device choices actually changed. True of lots of prefs!
781 // As is, we always stop monitoring before handling the device change.
782 if (gAudioIO->IsMonitoring())
783 {
784 gAudioIO->StopStream();
785 while (gAudioIO->IsBusy()) {
786 using namespace std::chrono;
787 std::this_thread::sleep_for(100ms);
788 }
789 }
790
791 if (audioSettingsChosen) {
792 PrefsPanel::Factories factories;
793 factories.push_back(PrefsPanel::PrefsNode(DevicePrefsFactory));
794
795 ViewDeviceSettingsDialog dialog(&GetProjectFrame(mProject), mProject, XO("Audio Settings:"), factories, 0);
796 dialog.SetSize(600, 420);
797 dialog.Center();
798
799 if (0 != dialog.ShowModal()) {
801 }
802 }
803 else {
804 gAudioIO->HandleDeviceChange();
806 }
807 }
808}
PrefsPanel * DevicePrefsFactory(wxWindow *parent, wxWindowID winid, AudacityProject *)
int DeviceToolbarPrefsID()
Methods for DeviceToolBar.
AUDACITY_DLL_API wxFrame & GetProjectFrame(AudacityProject &project)
Get the top-level window associated with the project (as a wxFrame only, when you do not need to use ...
void ChangeDevice(int deviceId, bool isInput)
bool ChangeHost(int hostId)
static void Broadcast(int id=0)
Call this static function to notify all PrefsListener objects.
Definition: Prefs.cpp:98
std::vector< PrefsPanel::PrefsNode > Factories
Definition: PrefsPanel.h:69
AudacityProject & mProject
Definition: ToolBar.h:251

References AudioIORecordChannels, PrefsListener::Broadcast(), ChangeDevice(), ChangeHost(), DevicePrefsFactory(), DeviceToolbarPrefsID(), AudioIOBase::Get(), GetProjectFrame(), anonymous_namespace{AudioSetupToolBar.cpp}::kAudioSettings, anonymous_namespace{AudioSetupToolBar.cpp}::kHost, anonymous_namespace{AudioSetupToolBar.cpp}::kInput, anonymous_namespace{AudioSetupToolBar.cpp}::kInputChannels, anonymous_namespace{AudioSetupToolBar.cpp}::kOutput, mInputChannels, ToolBar::mProject, Setting< T >::Write(), and XO.

Referenced by OnAudioSetup().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnRescannedDevices()

void AudioSetupToolBar::OnRescannedDevices ( DeviceChangeMessage  m)
private

Definition at line 652 of file AudioSetupToolBar.cpp.

653{
654 // Hosts may have disappeared or appeared so a complete repopulate is needed.
657}

References RepopulateMenus(), and Rescan.

Referenced by AudioSetupToolBar().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Populate()

void AudioSetupToolBar::Populate ( )
overridevirtual

Implements ToolBar.

Definition at line 123 of file AudioSetupToolBar.cpp.

124{
126 SetBackgroundColour( theTheme.Colour( clrMedium ) );
128
130
131#if wxUSE_TOOLTIPS
133 wxToolTip::Enable(true);
134 wxToolTip::SetDelay(1000);
135#endif
136
137 // Set default order and mode
139
141}
void RegenerateTooltips() override
static void MakeButtonBackgroundsSmall()
Definition: ToolBar.cpp:823

References ArrangeButtons(), ThemeBase::Colour(), DeinitChildren(), MakeAudioSetupButton(), ToolBar::MakeButtonBackgroundsSmall(), RegenerateTooltips(), RepopulateMenus(), and theTheme.

Here is the call graph for this function:

◆ ReCreateButtons()

void AudioSetupToolBar::ReCreateButtons ( )
overridevirtual

Reimplemented from ToolBar.

Definition at line 193 of file AudioSetupToolBar.cpp.

194{
195 bool isAudioSetupDown = false;
196
197 // ToolBar::ReCreateButtons() will get rid of its sizer and
198 // since we've attached our sizer to it, ours will get deleted too
199 // so clean ours up first.
200 if (mSizer)
201 {
202 isAudioSetupDown = mAudioSetup->IsDown();
203 Detach(mSizer);
204
205 std::unique_ptr < wxSizer > {mSizer}; // DELETE it
206 mSizer = nullptr;
207 }
208
210
211 if (isAudioSetupDown)
212 {
214 }
215
217
219}
void PushDown()
Definition: AButton.cpp:580
bool IsDown()
Definition: AButton.h:208
void EnableDisableButtons() override
virtual void ReCreateButtons()
Definition: ToolBar.cpp:525

References ToolBar::Detach(), EnableDisableButtons(), AButton::IsDown(), mAudioSetup, mSizer, AButton::PushDown(), ToolBar::ReCreateButtons(), and RegenerateTooltips().

Here is the call graph for this function:

◆ RegenerateTooltips()

void AudioSetupToolBar::RegenerateTooltips ( )
overrideprivatevirtual

Implements ToolBar.

Definition at line 412 of file AudioSetupToolBar.cpp.

413{
414#if wxUSE_TOOLTIPS
415 for (long iWinID = ID_AUDIO_SETUP_BUTTON; iWinID < BUTTON_COUNT; iWinID++)
416 {
417 auto pCtrl = static_cast<AButton*>(this->FindWindow(iWinID));
419 switch (iWinID)
420 {
422 name = wxT("Open Audio Setup");
423 break;
424 }
425 std::vector<ComponentInterfaceSymbol> commands(
426 1u, { name, Verbatim(pCtrl->GetLabel()) });
427
428 // Some have a second
429 switch (iWinID)
430 {
432 break;
433 }
435 mProject, *pCtrl, commands.data(), commands.size());
436 }
437#endif
438}
TranslatableString Verbatim(wxString str)
Require calls to the one-argument constructor to go through this distinct global function name.
size_t size() const
How many attachment pointers are in the Site.
Definition: ClientData.h:251
static void SetButtonToolTip(AudacityProject &project, AButton &button, const ComponentInterfaceSymbol commands[], size_t nCommands)
Definition: ToolBar.cpp:956

References BUTTON_COUNT, ID_AUDIO_SETUP_BUTTON, ToolBar::mProject, name, ToolBar::SetButtonToolTip(), ClientData::Site< Host, ClientData, ObjectCopyingPolicy, Pointer, ObjectLockingPolicy, RegistryLockingPolicy >::size(), Verbatim(), and wxT().

Referenced by Populate(), ReCreateButtons(), and UpdatePrefs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Repaint()

void AudioSetupToolBar::Repaint ( wxDC *  dc)
overridevirtual

Implements ToolBar.

Definition at line 143 of file AudioSetupToolBar.cpp.

144{
145#ifndef USE_AQUA_THEME
146 wxSize s = mSizer->GetSize();
147 wxPoint p = mSizer->GetPosition();
148
149 wxRect bevelRect(p.x, p.y, s.GetWidth() - 1, s.GetHeight() - 1);
150 AColor::Bevel(*dc, true, bevelRect);
151#endif
152}
static void Bevel(wxDC &dc, bool up, const wxRect &r)
Definition: AColor.cpp:266

References AColor::Bevel(), and mSizer.

Here is the call graph for this function:

◆ RepopulateMenus()

void AudioSetupToolBar::RepopulateMenus ( )
private

Definition at line 440 of file AudioSetupToolBar.cpp.

441{
442 FillHosts();
445 // make the device display selection reflect the prefs if they exist
446 UpdatePrefs();
447}
void UpdatePrefs() override

References FillHostDevices(), FillHosts(), FillInputChannels(), and UpdatePrefs().

Referenced by OnRescannedDevices(), and Populate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetDevices()

void AudioSetupToolBar::SetDevices ( const DeviceSourceMap in,
const DeviceSourceMap out 
)
private

Definition at line 685 of file AudioSetupToolBar.cpp.

686{
687 if (in) {
690 if (in->totalSources >= 1)
692 else
694 gPrefs->Flush();
695
697 }
698
699 if (out) {
701 if (out->totalSources >= 1) {
703 } else {
705 }
706 gPrefs->Flush();
707 }
708}
StringSetting AudioIOPlaybackSource
StringSetting AudioIOPlaybackDevice
IntSetting AudioIORecordingSourceIndex
bool Reset()
Reset to the default value.
Definition: Prefs.h:277
wxString sourceString
Definition: DeviceManager.h:34
wxString deviceString
Definition: DeviceManager.h:35

References AudioIOPlaybackDevice, AudioIOPlaybackSource, AudioIORecordingDevice, AudioIORecordingSource, AudioIORecordingSourceIndex, DeviceSourceMap::deviceString, FillInputChannels(), FileConfig::Flush(), gPrefs, Setting< T >::Reset(), DeviceSourceMap::sourceIndex, DeviceSourceMap::sourceString, DeviceSourceMap::totalSources, and Setting< T >::Write().

Referenced by ChangeDevice(), and UpdatePrefs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdatePrefs()

void AudioSetupToolBar::UpdatePrefs ( )
overridevirtual

Implements PrefsListener.

Definition at line 258 of file AudioSetupToolBar.cpp.

259{
260 wxString desc;
261 const std::vector<DeviceSourceMap> &inMaps = DeviceManager::Instance()->GetInputDeviceMaps();
262 const std::vector<DeviceSourceMap> &outMaps = DeviceManager::Instance()->GetOutputDeviceMaps();
263
264 auto selectedHost = GetSelectedRadioItemLabel(*mHost);
265 wxString oldHost = selectedHost ? *selectedHost : wxString{};
266
267 auto hostName = AudioIOHost.Read();
268
269 // if the prefs host name doesn't match the one displayed, it changed
270 // in another project's AudioSetupToolBar, so we need to repopulate everything.
271 if (oldHost != hostName)
273
274 auto devName = AudioIORecordingDevice.Read();
275 auto sourceName = AudioIORecordingSource.Read();
276 if (sourceName.empty())
277 desc = devName;
278 else
279 desc = devName + wxT(": ") + sourceName;
280
281 auto selectedInput = GetSelectedRadioItemLabel(*mInput);
282 if (selectedInput && *selectedInput != desc) {
283 if (auto item = mInput->FindItem(desc); item != wxNOT_FOUND) {
284 mInput->FindChildItem(item)->Check();
286 }
287 else if (mInput->GetMenuItemCount()) {
288 for (size_t i = 0; i < inMaps.size(); i++) {
289 if (inMaps[i].hostString == hostName &&
290 MakeDeviceSourceString(&inMaps[i]) == mInput->FindItem(kInput)->GetItemLabelText()) {
291 // use the default. It should exist but check just in case, falling back on the 0 index.
292 DeviceSourceMap* defaultMap = DeviceManager::Instance()->GetDefaultInputDevice(inMaps[i].hostIndex);
293 if (defaultMap) {
294 const auto menuId = mInput->FindItem(MakeDeviceSourceString(defaultMap));
295 auto item = mInput->FindChildItem(menuId);
296 if (item)
297 item->Check();
298
299 SetDevices(defaultMap, nullptr);
300 }
301 else {
302 //use the first item (0th index) if we have no familiar devices
303 auto item = mInput->FindChildItem(kInput);
304 if (item)
305 item->Check();
306
307 SetDevices(&inMaps[i], nullptr);
308 }
309 break;
310 }
311 }
312 }
313 }
314
315 devName = AudioIOPlaybackDevice.Read();
316 sourceName = AudioIOPlaybackSource.Read();
317 if (sourceName.empty())
318 desc = devName;
319 else
320 desc = devName + wxT(": ") + sourceName;
321
322 auto selectedOutput = GetSelectedRadioItemLabel(*mOutput);
323 if (selectedOutput && *selectedOutput != desc) {
324 if (auto item = mOutput->FindItem(desc); item != wxNOT_FOUND) {
325 mOutput->FindChildItem(item)->Check();
326 }
327 else if (mOutput->GetMenuItemCount()) {
328 for (size_t i = 0; i < outMaps.size(); i++) {
329 if (outMaps[i].hostString == hostName &&
330 MakeDeviceSourceString(&outMaps[i]) == mOutput->FindItem(kOutput)->GetItemLabelText()) {
331 // use the default. It should exist but check just in case, falling back on the 0 index.
332 DeviceSourceMap* defaultMap = DeviceManager::Instance()->GetDefaultInputDevice(outMaps[i].hostIndex);
333 if (defaultMap) {
334 const auto menuId = mOutput->FindItem(MakeDeviceSourceString(defaultMap));
335 auto item = mOutput->FindChildItem(menuId);
336 if (item)
337 item->Check();
338
339 SetDevices(nullptr, defaultMap);
340 }
341 else {
342 //use the first item (0th index) if we have no familiar devices
343 auto item = mOutput->FindChildItem(kOutput);
344 if (item)
345 item->Check();
346
347 SetDevices(nullptr, &outMaps[i]);
348 }
349 break;
350 }
351 }
352 }
353 }
354
355 long oldChannels = 0;
356 for (const auto & item : mInputChannels->GetMenuItems()) {
357 if (item->IsChecked())
358 oldChannels = item->GetId() - kInputChannels + 1;
359 }
360
361 auto newChannels = AudioIORecordChannels.ReadWithDefault(0);
362 if (newChannels > 0 && oldChannels != newChannels) {
363 auto item = mInputChannels->FindChildItem(kInputChannels + newChannels - 1);
364 if (item != nullptr)
365 item->Check();
366 }
367
368 selectedHost = GetSelectedRadioItemLabel(*mHost);
369 if (!hostName.empty() && selectedHost && selectedHost != hostName) {
370 const auto id = mHost->FindItem(hostName);
371 if (id != wxNOT_FOUND) {
372 mHost->FindChildItem(id)->Check();
373 }
374 }
375
377
378 // Set label to pull in language change
379 SetLabel(XO("Audio Setup"));
380
381 // Give base class a chance
383
384 Layout();
385 Refresh();
386}
const TranslatableString desc
Definition: ExportPCM.cpp:58
DeviceSourceMap * GetDefaultInputDevice(int hostIndex)
bool ReadWithDefault(T *pVar, const T &defaultValue) const
overload of ReadWithDefault returning a boolean that is true if the value was previously defined *‍/
Definition: Prefs.h:206
void SetLabel(const wxString &label) override
Definition: ToolBar.cpp:407
void UpdatePrefs() override
Definition: ToolBar.cpp:614

References AudioIOHost, AudioIOPlaybackDevice, AudioIOPlaybackSource, AudioIORecordChannels, AudioIORecordingDevice, AudioIORecordingSource, desc, FillHostDevices(), FillInputChannels(), DeviceManager::GetDefaultInputDevice(), DeviceManager::GetInputDeviceMaps(), DeviceManager::GetOutputDeviceMaps(), GetSelectedRadioItemLabel(), DeviceManager::Instance(), anonymous_namespace{AudioSetupToolBar.cpp}::kInput, anonymous_namespace{AudioSetupToolBar.cpp}::kInputChannels, anonymous_namespace{AudioSetupToolBar.cpp}::kOutput, MakeDeviceSourceString(), mHost, mInput, mInputChannels, mOutput, Setting< T >::Read(), Setting< T >::ReadWithDefault(), RegenerateTooltips(), SetDevices(), ToolBar::SetLabel(), ToolBar::UpdatePrefs(), wxT(), and XO.

Referenced by RepopulateMenus(), and UpdateSelectedPrefs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateSelectedPrefs()

void AudioSetupToolBar::UpdateSelectedPrefs ( int  id)
overridevirtual

Reimplemented from PrefsListener.

Definition at line 388 of file AudioSetupToolBar.cpp.

389{
390 if (id == DeviceToolbarPrefsID())
391 UpdatePrefs();
393}
virtual void UpdateSelectedPrefs(int id)
Definition: Prefs.cpp:128

References DeviceToolbarPrefsID(), UpdatePrefs(), and PrefsListener::UpdateSelectedPrefs().

Here is the call graph for this function:

Member Data Documentation

◆ mAudioSetup

AButton* AudioSetupToolBar::mAudioSetup {}
private

◆ mHost

std::unique_ptr<wxMenu> AudioSetupToolBar::mHost
private

◆ mInput

std::unique_ptr<wxMenu> AudioSetupToolBar::mInput
private

◆ mInputChannels

std::unique_ptr<wxMenu> AudioSetupToolBar::mInputChannels
private

◆ mOutput

std::unique_ptr<wxMenu> AudioSetupToolBar::mOutput
private

◆ mSizer

wxBoxSizer* AudioSetupToolBar::mSizer {}
private

Definition at line 75 of file AudioSetupToolBar.h.

Referenced by ArrangeButtons(), ReCreateButtons(), and Repaint().

◆ mSubscription

Observer::Subscription AudioSetupToolBar::mSubscription
private

Definition at line 82 of file AudioSetupToolBar.h.


The documentation for this class was generated from the following files: