You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
7.0 KiB
226 lines
7.0 KiB
/***************************************************************************
|
|
oss-sound.h - description
|
|
-------------------
|
|
begin : Sun Mar 21 2004
|
|
copyright : (C) 2004 by Martin Witte
|
|
email : witte@kawo1.rwth-aachen.de
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* 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_OSS_SOUND_H
|
|
#define _KRADIO_OSS_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 <tqobject.h>
|
|
#include <tqtimer.h>
|
|
|
|
enum DUPLEX_MODE { DUPLEX_UNKNOWN, DUPLEX_FULL, DUPLEX_HALF };
|
|
|
|
|
|
struct SoundStreamConfig
|
|
{
|
|
SoundStreamConfig()
|
|
: m_ActiveMode(false),
|
|
m_Channel(-1),
|
|
m_Volume(-1)
|
|
{}
|
|
|
|
SoundStreamConfig(int _channel, bool active_mode = true)
|
|
: m_ActiveMode(active_mode),
|
|
m_Channel(_channel),
|
|
m_Volume(-1)
|
|
{}
|
|
|
|
SoundStreamConfig(const SoundStreamConfig &c)
|
|
: m_ActiveMode(c.m_ActiveMode),
|
|
m_Channel(c.m_Channel),
|
|
m_Volume(c.m_Volume)
|
|
{}
|
|
|
|
bool m_ActiveMode;
|
|
int m_Channel;
|
|
float m_Volume;
|
|
};
|
|
|
|
|
|
class OSSSoundDevice : public TQObject,
|
|
public PluginBase,
|
|
public ISoundStreamClient
|
|
{
|
|
Q_OBJECT
|
|
TQ_OBJECT
|
|
|
|
public:
|
|
OSSSoundDevice (const TQString &name);
|
|
virtual ~OSSSoundDevice ();
|
|
|
|
virtual bool connectI(Interface *i);
|
|
virtual bool disconnectI(Interface *i);
|
|
|
|
// PluginBase
|
|
|
|
public:
|
|
virtual void saveState (KConfig *) const;
|
|
virtual void restoreState (KConfig *);
|
|
|
|
virtual TQString pluginClassName() const { return "OSSSoundDevice"; }
|
|
|
|
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
|
|
|
|
protected:
|
|
void getMixerChannels(int query_playback_or_rec_mask, TQStringList &retval, TQMap<TQString, int> &revmap) const;
|
|
|
|
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;
|
|
|
|
// 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 getBufferSize() const { return m_BufferSize; }
|
|
bool isPlaybackEnabled() const { return m_EnablePlayback; }
|
|
bool isCaptureEnabled() const { return m_EnableCapture; }
|
|
const TQString &getDSPDeviceName() const { return m_DSPDeviceName; }
|
|
const TQString &getMixerDeviceName() const { return m_MixerDeviceName; }
|
|
|
|
void setBufferSize(int s);
|
|
void enablePlayback(bool on);
|
|
void enableCapture(bool on);
|
|
void setDSPDeviceName(const TQString &s);
|
|
void setMixerDeviceName(const TQString &dev_name);
|
|
|
|
// own functions
|
|
|
|
static int getOSSFormat(const SoundFormat &f);
|
|
|
|
protected slots:
|
|
|
|
void slotPoll();
|
|
|
|
signals:
|
|
|
|
void sigUpdateConfig();
|
|
|
|
protected:
|
|
|
|
bool openDSPDevice(const SoundFormat &format, bool reopen = false);
|
|
bool closeDSPDevice(bool force = false);
|
|
|
|
bool openMixerDevice(bool reopen = false);
|
|
bool closeMixerDevice(bool force = false);
|
|
|
|
void checkMixerVolume(SoundStreamID id);
|
|
float readMixerVolume(int channel) const;
|
|
float writeMixerVolume(int channel, float vol);
|
|
|
|
void selectCaptureChannel (int channel);
|
|
|
|
TQString m_DSPDeviceName,
|
|
m_MixerDeviceName;
|
|
int m_DSP_fd,
|
|
m_Mixer_fd;
|
|
DUPLEX_MODE m_DuplexMode;
|
|
SoundFormat m_DSPFormat;
|
|
|
|
TQStringList m_PlaybackChannels,
|
|
m_CaptureChannels;
|
|
TQMap<TQString, int> m_revPlaybackChannels,
|
|
m_revCaptureChannels;
|
|
|
|
TQMap<SoundStreamID, SoundStreamConfig>
|
|
m_PlaybackStreams,
|
|
m_CaptureStreams;
|
|
|
|
TQValueList<SoundStreamID>
|
|
m_PassivePlaybackStreams;
|
|
SoundStreamID m_PlaybackStreamID,
|
|
m_CaptureStreamID;
|
|
|
|
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_PollingTimer;
|
|
};
|
|
|
|
|
|
|
|
#endif
|