diff options
| author | Calvin Morrison <calvin@pobox.com> | 2026-05-12 21:32:53 -0400 |
|---|---|---|
| committer | Calvin Morrison <calvin@pobox.com> | 2026-05-12 21:32:53 -0400 |
| commit | f6f7c36909fa161efe53c40e9b4c34856e751536 (patch) | |
| tree | eff44527b0be61eb2e19c9f483ed38b72879af11 /src/model/pulsemodel.h | |
Initial tmix skeleton — model layer + basic UI
PulseModel: stable PulseDevice objects keyed by PA index, updated
in-place via postEvent reconciliation. No bulk rebuilds. Three signals:
deviceAdded, deviceRemoved (device changed handled per-device via
volumeChanged/muteChanged/nameChanged).
MixerWindow: four-tab layout (Output/Input/Playback/Recording), adds
and removes individual DeviceWidgets in response to model signals.
Builds and links cleanly against TQt3/TDE + libpulse.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'src/model/pulsemodel.h')
| -rw-r--r-- | src/model/pulsemodel.h | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/model/pulsemodel.h b/src/model/pulsemodel.h new file mode 100644 index 0000000..b96f2b1 --- /dev/null +++ b/src/model/pulsemodel.h @@ -0,0 +1,58 @@ +#pragma once + +#include <tqobject.h> +#include <tqptrlist.h> + +#include <pulse/pulseaudio.h> + +#include "audiodevice.h" + +class PulseDevice; + +class PulseModel : public TQObject +{ + TQ_OBJECT + +public: + explicit PulseModel( TQObject *parent = 0 ); + ~PulseModel(); + + bool open(); + void close(); + + TQPtrList<AudioDevice> devices( AudioDevice::Category cat ) const; + +protected: + void customEvent( TQCustomEvent *e ); + +signals: + void deviceAdded( AudioDevice *dev ); + void deviceRemoved( AudioDevice *dev ); + void ready(); // emitted once initial enumeration is complete + +private: + static void contextStateCb( pa_context *c, 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 subscribeCb( pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata ); + + void enumerateAll(); + void addOrUpdateSink( const pa_sink_info *info ); + void addOrUpdateSource( const pa_source_info *info ); + void addOrUpdateSinkInput( const pa_sink_input_info *info ); + void addOrUpdateSourceOutput( const pa_source_output_info *info ); + void removeDevice( AudioDevice::Category cat, uint32_t paIndex ); + + pa_threaded_mainloop *m_mainloop; + pa_context *m_context; + + // Keyed by PA index within each category — stable objects, updated in place. + TQPtrList<PulseDevice> m_sinks; + TQPtrList<PulseDevice> m_sources; + TQPtrList<PulseDevice> m_sinkInputs; + TQPtrList<PulseDevice> m_sourceOutputs; + + PulseDevice *findDevice( TQPtrList<PulseDevice> &list, uint32_t paIndex ); +}; |
