From e776bc768cf9afca1867200e25d64d315cd72a3e Mon Sep 17 00:00:00 2001 From: Calvin Morrison Date: Fri, 15 May 2026 10:10:04 -0400 Subject: Full mixer implementation — tray, popup, prefs, devices tab with port indicators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the complete tmix feature set built since the initial skeleton: balance knob, level meters, KLed mute button, system tray with scroll-wheel volume and recording indicator, tray popup, preferences dialog, right-click context menus, single-instance enforcement, scroll area, window geometry persistence, and Devices tab with PA card profile switcher and live port availability indicators (2-column layout, in-place updates on plug/unplug). Co-Authored-By: Claude Sonnet 4.6 --- src/model/pulsemodel.h | 66 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 3 deletions(-) (limited to 'src/model/pulsemodel.h') diff --git a/src/model/pulsemodel.h b/src/model/pulsemodel.h index b96f2b1..52e379f 100644 --- a/src/model/pulsemodel.h +++ b/src/model/pulsemodel.h @@ -2,6 +2,8 @@ #include #include +#include +#include #include @@ -9,6 +11,38 @@ class PulseDevice; +// ---- card data structures --------------------------------------------------- + +struct PulseCardProfile { + TQString name; + TQString description; + bool available; +}; + +struct PulseCardPort { + TQString name; + TQString description; + int available; // pa_port_available_t: 0=unknown, 1=no, 2=yes + int direction; // PA_DIRECTION_INPUT=1, PA_DIRECTION_OUTPUT=2 + uint32_t type; // pa_device_port_type_t + TQString availabilityGroup; +}; + +struct PulseCardInfo { + uint32_t index; + TQString name; + TQString description; + TQString activeProfile; + TQString vendor; // device.vendor.name + TQString product; // device.product.name + TQString formFactor; // device.form_factor + TQString busType; // device.bus (pci/usb/etc) + TQValueList profiles; + TQValueList ports; +}; + +// ---- model ------------------------------------------------------------------ + class PulseModel : public TQObject { TQ_OBJECT @@ -21,6 +55,16 @@ public: void close(); TQPtrList devices( AudioDevice::Category cat ) const; + AudioDevice *defaultOutput() const; + AudioDevice *defaultInput() const; + + void setDefaultOutput( AudioDevice *dev ); + void setDefaultInput( AudioDevice *dev ); + void moveSinkInputToSink( AudioDevice *playbackDev, AudioDevice *outputDev ); + + TQValueList cards() const { return m_cards; } + const PulseCardInfo *card( uint32_t index ) const; + void setCardProfile( uint32_t cardIndex, const TQString &profileName ); protected: void customEvent( TQCustomEvent *e ); @@ -28,14 +72,22 @@ protected: signals: void deviceAdded( AudioDevice *dev ); void deviceRemoved( AudioDevice *dev ); - void ready(); // emitted once initial enumeration is complete + void defaultOutputChanged( AudioDevice *dev ); + void defaultInputChanged( AudioDevice *dev ); + void ready(); + + void cardAdded( uint32_t index ); + void cardRemoved( uint32_t index ); + void cardUpdated( uint32_t index ); private: static void contextStateCb( pa_context *c, void *userdata ); + static void serverInfoCb( pa_context *c, const pa_server_info *info, void *userdata ); static void sinkInfoCb( pa_context *c, const pa_sink_info *info, int eol, void *userdata ); static void sourceInfoCb( pa_context *c, const pa_source_info *info, int eol, void *userdata ); static void sinkInputInfoCb( pa_context *c, const pa_sink_input_info *info, int eol, void *userdata ); static void sourceOutputInfoCb( pa_context *c, const pa_source_output_info *info, int eol, void *userdata ); + static void cardInfoCb( pa_context *c, const pa_card_info *info, int eol, void *userdata ); static void subscribeCb( pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata ); void enumerateAll(); @@ -48,11 +100,19 @@ private: pa_threaded_mainloop *m_mainloop; pa_context *m_context; - // Keyed by PA index within each category — stable objects, updated in place. TQPtrList m_sinks; TQPtrList m_sources; TQPtrList m_sinkInputs; TQPtrList m_sourceOutputs; - PulseDevice *findDevice( TQPtrList &list, uint32_t paIndex ); + TQMap m_sinksByName; + TQMap m_sourcesByName; + TQString m_defaultSinkName; + TQString m_defaultSourceName; + TQMap m_sourceOutputToSource; // soIdx → sourceIdx + + TQValueList m_cards; + + PulseDevice *findDevice( TQPtrList &list, uint32_t paIndex ); + PulseCardInfo *findCard( uint32_t index ); }; -- cgit v1.2.3