diff options
Diffstat (limited to 'tderadio3/plugins/alsa-sound/alsa-sound.h')
-rw-r--r-- | tderadio3/plugins/alsa-sound/alsa-sound.h | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/tderadio3/plugins/alsa-sound/alsa-sound.h b/tderadio3/plugins/alsa-sound/alsa-sound.h new file mode 100644 index 0000000..4a79832 --- /dev/null +++ b/tderadio3/plugins/alsa-sound/alsa-sound.h @@ -0,0 +1,297 @@ +/*************************************************************************** + alsa-sound.h - description + ------------------- + begin : Thu May 26 2005 + copyright : (C) 2005 by Martin Witte + email : [email protected] + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef _KRADIO_ALSA_SOUND_H +#define _KRADIO_ALSA_SOUND_H + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "../../src/include/ringbuffer.h" +#include "../../src/include/plugins.h" +#include "../../src/include/soundstreamclient_interfaces.h" + +#include "alsa-config-mixer-setting.h" + +#include <tqobject.h> +#include <tqtimer.h> +#include <alsa/asoundlib.h> + +enum DUPLEX_MODE { DUPLEX_UNKNOWN, DUPLEX_FULL, DUPLEX_HALF }; + + +struct SoundStreamConfig +{ + SoundStreamConfig() + : m_ActiveMode(false), + m_Channel(TQString()), + m_Volume(-1), + m_Muted(false) + {} + + SoundStreamConfig(const TQString &_channel, bool active_mode = true) + : m_ActiveMode(active_mode), + m_Channel(_channel), + m_Volume(-1), + m_Muted(false) + {} + + SoundStreamConfig(const SoundStreamConfig &c) + : m_ActiveMode(c.m_ActiveMode), + m_Channel(c.m_Channel), + m_Volume(c.m_Volume), + m_Muted(c.m_Muted) + {} + + bool m_ActiveMode; + TQString m_Channel; + float m_Volume; + bool m_Muted; +}; + + +class AlsaCaptureThread; + +class AlsaMixerElement +{ +public: + AlsaMixerElement() { snd_mixer_selem_id_malloc(&m_ID); } + AlsaMixerElement(snd_mixer_selem_id_t *id) { snd_mixer_selem_id_malloc(&m_ID); snd_mixer_selem_id_copy(m_ID, id) ; } + AlsaMixerElement(const AlsaMixerElement &x) { snd_mixer_selem_id_malloc(&m_ID); snd_mixer_selem_id_copy(m_ID, x.m_ID); } + ~AlsaMixerElement() { snd_mixer_selem_id_free (m_ID); } + + operator snd_mixer_selem_id_t *&() { return m_ID; } + + AlsaMixerElement &operator = (const AlsaMixerElement &x) { snd_mixer_selem_id_copy(m_ID, x.m_ID); return *this; } + +protected: + snd_mixer_selem_id_t *m_ID; +}; + + +class AlsaSoundDevice : public TQObject, + public PluginBase, + public ISoundStreamClient +{ +Q_OBJECT + + +public: + AlsaSoundDevice (const TQString &name); + virtual ~AlsaSoundDevice (); + + virtual bool connectI(Interface *i); + virtual bool disconnectI(Interface *i); + + // PluginBase + +public: + virtual void saveState (TDEConfig *) const; + virtual void restoreState (TDEConfig *); + + virtual TQString pluginClassName() const { return "AlsaSoundDevice"; } + + virtual const TQString &name() const { return PluginBase::name(); } + virtual TQString &name() { return PluginBase::name(); } + + virtual ConfigPageInfo createConfigurationPage(); + virtual AboutPageInfo createAboutPage(); + + // ISoundStreamClient: direct device access + +RECEIVERS: + void noticeConnectedI (ISoundStreamServer *s, bool pointer_valid); + bool preparePlayback(SoundStreamID id, const TQString &channel, bool active_mode, bool start_immediately); + bool prepareCapture(SoundStreamID id, const TQString &channel); + bool releasePlayback(SoundStreamID id); + bool releaseCapture(SoundStreamID id); + +ANSWERS: + bool supportsPlayback() const; + bool supportsCapture() const; + + TQString getSoundStreamClientDescription() const; + + // ISoundStreamClient: mixer access + +public: + static + void getPlaybackMixerChannels(int card, snd_mixer_t *mixer_handle, + TQStringList &retval, TQMap<TQString, AlsaMixerElement> &int2id); + static + void getCaptureMixerChannels (int card, snd_mixer_t *mixer_handle, + TQStringList &vol_list, TQMap<TQString, AlsaMixerElement> &vol_ch2id, + TQStringList &sw_list, TQMap<TQString, AlsaMixerElement> &sw_ch2id, + TQStringList *all_list = NULL); + +ANSWERS: + const TQStringList &getPlaybackChannels() const; + const TQStringList &getCaptureChannels() const; + +RECEIVERS: + bool setPlaybackVolume(SoundStreamID id, float volume); + bool setCaptureVolume(SoundStreamID id, float volume); + bool getPlaybackVolume(SoundStreamID id, float &volume) const; + bool getCaptureVolume(SoundStreamID id, float &volume) const; + + bool mute (SoundStreamID id, bool mute); + bool unmute (SoundStreamID id, bool unmute); + bool isMuted(SoundStreamID id, bool &m) const; + + + // ISoundStreamClient: generic broadcasts + +RECEIVERS: + bool startPlayback(SoundStreamID id); + bool pausePlayback(SoundStreamID id); + bool stopPlayback(SoundStreamID id); + bool isPlaybackRunning(SoundStreamID id, bool &b) const; + + bool startCaptureWithFormat(SoundStreamID id, + const SoundFormat &proposed_format, + SoundFormat &real_format, + bool force_format); + bool stopCapture(SoundStreamID id); + bool isCaptureRunning(SoundStreamID id, bool &b, SoundFormat &sf) const; + + bool noticeSoundStreamClosed(SoundStreamID id); + bool noticeSoundStreamRedirected(SoundStreamID oldID, SoundStreamID newID); + + bool noticeSoundStreamData(SoundStreamID id, + const SoundFormat &, + const char *data, size_t size, size_t &consumed_size, + const SoundMetaData &md + ); + + + // Config Access + + int getHWBufferSize() const { return m_HWBufferSize; } + int getBufferSize() const { return m_BufferSize; } + bool isPlaybackEnabled() const { return m_EnablePlayback; } + bool isCaptureEnabled() const { return m_EnableCapture; } + int getPlaybackCard() const { return m_PlaybackCard; } + int getPlaybackDevice() const { return m_PlaybackDevice; } + int getCaptureCard() const { return m_CaptureCard; } + int getCaptureDevice() const { return m_CaptureDevice; } + const TQMap<TQString, AlsaConfigMixerSetting> & + getCaptureMixerSettings() const { return m_CaptureMixerSettings; } + + void setHWBufferSize(int s); + void setBufferSize(int s); + void enablePlayback(bool on); + void enableCapture(bool on); + void setPlaybackDevice(int card, int device); + void setCaptureDevice(int card, int device); + void setCaptureMixerSettings(const TQMap<TQString, AlsaConfigMixerSetting> &map); + +protected slots: + + void slotPollPlayback(); + void slotPollCapture(); + +signals: + + void sigUpdateConfig(); + +protected: +// bool event(TQEvent *_e); + + bool openAlsaDevice(snd_pcm_t *&alsa_handle, SoundFormat &format, const char *pcm_name, snd_pcm_stream_t stream, int flags, unsigned &latency); + + bool openPlaybackDevice (const SoundFormat &format, bool reopen = false); + bool openCaptureDevice (const SoundFormat &format, bool reopen = false); + bool closePlaybackDevice(bool force = false); + bool closeCaptureDevice (bool force = false); + + bool openPlaybackMixerDevice (bool reopen = false); + bool openCaptureMixerDevice (bool reopen = false); + static bool openMixerDevice(snd_mixer_t *&mixer_handle, int card, bool reopen, TQTimer *timer, int timer_latency); + bool closeCaptureMixerDevice (bool force = false); + bool closePlaybackMixerDevice(bool force = false); + static bool closeMixerDevice(snd_mixer_t *&mixer_handle, int card, SoundStreamID id, snd_pcm_t *pcm_handle, bool force, TQTimer *timer); + + void checkMixerVolume(SoundStreamID id); + float readPlaybackMixerVolume(const TQString &channel, bool &muted) const; + float readCaptureMixerVolume(const TQString &channel) const; + bool writePlaybackMixerVolume(const TQString &channel, float &vol, bool muted); + bool writeCaptureMixerVolume(const TQString &channel, float &vol); + bool writeCaptureMixerSwitch(const TQString &channel, bool capture); + + void selectCaptureChannel (const TQString &channel); + + /* ALSA HANDLES */ + snd_pcm_t *m_hPlayback; + snd_pcm_t *m_hCapture; + snd_mixer_t *m_hPlaybackMixer; + snd_mixer_t *m_hCaptureMixer; + + SoundFormat m_PlaybackFormat; + SoundFormat m_CaptureFormat; + int m_PlaybackCard; + int m_PlaybackDevice; + int m_CaptureCard; + int m_CaptureDevice; + + unsigned m_PlaybackLatency; + unsigned m_CaptureLatency; + + TQStringList m_PlaybackChannels, + m_CaptureChannels, + m_CaptureChannelsSwitch; + + TQMap<TQString, AlsaMixerElement> m_PlaybackChannels2ID, + m_CaptureChannels2ID, + m_CaptureChannelsSwitch2ID; + + TQMap<SoundStreamID, SoundStreamConfig> + m_PlaybackStreams, + m_CaptureStreams; + + TQValueList<SoundStreamID> + m_PassivePlaybackStreams; + SoundStreamID m_PlaybackStreamID, + m_CaptureStreamID; + + size_t m_HWBufferSize; + size_t m_BufferSize; + RingBuffer m_PlaybackBuffer, + m_CaptureBuffer; + + unsigned m_CaptureRequestCounter; + TQ_UINT64 m_CapturePos; + time_t m_CaptureStartTime; + + size_t //m_PlaybackSkipCount, + m_CaptureSkipCount; + + bool m_EnablePlayback, + m_EnableCapture; + + TQTimer m_PlaybackPollingTimer; + TQTimer m_CapturePollingTimer; + +// AlsaCaptureThread *m_captureThread; + + TQMap<TQString, AlsaConfigMixerSetting> m_CaptureMixerSettings; + +}; + + + +#endif |