diff options
Diffstat (limited to 'src/soundstreamclient_interfaces.cpp')
-rw-r--r-- | src/soundstreamclient_interfaces.cpp | 426 |
1 files changed, 426 insertions, 0 deletions
diff --git a/src/soundstreamclient_interfaces.cpp b/src/soundstreamclient_interfaces.cpp new file mode 100644 index 0000000..fd4822c --- /dev/null +++ b/src/soundstreamclient_interfaces.cpp @@ -0,0 +1,426 @@ +/*************************************************************************** + sounddevice_interfaces.cpp - description + ------------------- + begin : Mon Mär 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. * + * * + ***************************************************************************/ + +#include "include/soundstreamclient_interfaces.h" + +#include <unistd.h> +#include <time.h> +#include <fcntl.h> + +const char *dev_urandom = "/dev/urandom"; + +//////////////////////////////////////////// + +void ISoundStreamServer::noticeConnectedI(cmplInterface *i, bool pointer_valid) +{ + for (TQPtrListIterator<cmplInterface> it(iConnections); it.current(); ++it) { + it.current()->noticeConnectedSoundClient(i, pointer_valid); + cmplInterface *x = it.current(); + if (x != i && pointer_valid) + i->noticeConnectedSoundClient(x, x->isThisInterfacePointerValid()); + } +} + +void ISoundStreamServer::noticeDisconnectedI(cmplInterface *i, bool pointer_valid) +{ + for (TQPtrListIterator<cmplInterface> it(iConnections); it.current(); ++it) { + it.current()->noticeDisconnectedSoundClient(i, pointer_valid); + cmplInterface *x = it.current(); + if (x != i && pointer_valid) + i->noticeDisconnectedSoundClient(x, x->isThisInterfacePointerValid()); + } +} + + + +TQPtrList<ISoundStreamClient> ISoundStreamServer::getPlaybackMixers() const +{ + TQPtrList<ISoundStreamClient> tmp; + for (TQPtrListIterator<ISoundStreamClient> it(iConnections); it.current(); ++it) { + if (it.current()->supportsPlayback()) + tmp.append(it.current()); + } + return tmp; +} + +TQPtrList<ISoundStreamClient> ISoundStreamServer::getCaptureMixers() const +{ + TQPtrList<ISoundStreamClient> tmp; + for (TQPtrListIterator<ISoundStreamClient> it(iConnections); it.current(); ++it) { + if (it.current()->supportsCapture()) + tmp.append(it.current()); + } + return tmp; +} + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendPlaybackVolume, (SoundStreamID id, float volume), + setPlaybackVolume(id, volume) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendCaptureVolume, (SoundStreamID id, float volume), + setCaptureVolume(id, volume) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryPlaybackVolume, (SoundStreamID id, float &volume), + getPlaybackVolume(id, volume) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryCaptureVolume, (SoundStreamID id, float &volume), + getCaptureVolume(id, volume) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifyPlaybackVolumeChanged, (SoundStreamID id, float volume), + noticePlaybackVolumeChanged(id, volume) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifyCaptureVolumeChanged, (SoundStreamID id, float volume), + noticeCaptureVolumeChanged(id, volume) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendReleasePlayback, (SoundStreamID id), + releasePlayback(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendReleaseCapture, (SoundStreamID id), + releaseCapture(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendStartPlayback, (SoundStreamID id), + startPlayback(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendPausePlayback, (SoundStreamID id), + pausePlayback(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendStopPlayback, (SoundStreamID id), + stopPlayback(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryIsPlaybackRunning, (SoundStreamID id, bool &b), + isPlaybackRunning(id, b) ); + +//IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendStartCapture, (SoundStreamID id), +// startCapture(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendStartCaptureWithFormat, (SoundStreamID id, const SoundFormat &proposed_format, SoundFormat &real_format, bool force_format), + startCaptureWithFormat(id, proposed_format, real_format, force_format) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendStopCapture, (SoundStreamID id), + stopCapture(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryIsCaptureRunning, (SoundStreamID id, bool &b, SoundFormat &sf), + isCaptureRunning(id, b, sf) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendStartRecording, (SoundStreamID id), + startRecording(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendStartRecordingWithFormat, (SoundStreamID id, const SoundFormat &proposed_format, SoundFormat &real_format), + startRecordingWithFormat(id, proposed_format, real_format) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendStopRecording, (SoundStreamID id), + stopRecording(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryIsRecordingRunning, (SoundStreamID id, bool &b, SoundFormat &sf), + isRecordingRunning(id, b, sf) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifySoundStreamCreated, (SoundStreamID id), + noticeSoundStreamCreated(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifySoundStreamClosed, (SoundStreamID id), + noticeSoundStreamClosed(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifySoundStreamRedirected, (SoundStreamID oldID, SoundStreamID newID), + noticeSoundStreamRedirected(oldID, newID) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifySoundStreamChanged, (SoundStreamID id), + noticeSoundStreamChanged(id) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifySoundStreamData, (SoundStreamID id, const SoundFormat &format, const char *data, size_t size, size_t &consumed_size, const SoundMetaData &md), + noticeSoundStreamData(id, format, data, size, consumed_size, md) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifyReadyForPlaybackData, (SoundStreamID id, size_t size), + noticeReadyForPlaybackData(id, size) ); + + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifyTrebleChanged, (SoundStreamID id, float v), + noticeTrebleChanged(id, v) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifyBassChanged, (SoundStreamID id, float v), + noticeBassChanged(id, v) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifyBalanceChanged, (SoundStreamID id, float v), + noticeBalanceChanged(id, v) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifyMuted, (SoundStreamID id, bool m), + noticeMuted(id, m) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifySignalQualityChanged, (SoundStreamID id, float q), + noticeSignalQualityChanged(id, q) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifySignalQualityBoolChanged, (SoundStreamID id, bool good), + noticeSignalQualityChanged(id, good) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifySignalMinQualityChanged, (SoundStreamID id, float q), + noticeSignalMinQualityChanged(id, q) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifyStereoChanged, (SoundStreamID id, bool s), + noticeStereoChanged(id, s) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendTreble , (SoundStreamID id, float v), + setTreble(id, v) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendBass , (SoundStreamID id, float v), + setBass(id, v) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendBalance , (SoundStreamID id, float v), + setBalance(id, v) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendMute , (SoundStreamID id, bool mute), + mute(id, mute) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendUnmute , (SoundStreamID id, bool unmute), + unmute(id, unmute) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendSignalMinQuality , (SoundStreamID id, float q), + setSignalMinQuality(id, q) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, sendStereo, (SoundStreamID id, bool s), + setStereo(id, s) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryTreble, (SoundStreamID id, float &v), + getTreble(id, v) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryBass, (SoundStreamID id, float &v), + getBass(id, v) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryBalance, (SoundStreamID id, float &v), + getBalance(id, v) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, querySignalQuality, (SoundStreamID id, float &q), + getSignalQuality(id, q) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, querySignalMinQuality, (SoundStreamID id, float &q), + getSignalMinQuality(id, q) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryHasGoodQuality, (SoundStreamID id, bool &good), + hasGoodQuality(id, good) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryIsStereo, (SoundStreamID id, bool &s), + isStereo(id, s) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryIsMuted, (SoundStreamID id, bool &m), + isMuted(id, m) ); + + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifyPlaybackChannelsChanged, (const TQString &client_id, const TQStringList &map), + noticePlaybackChannelsChanged(client_id, map) ); +IF_IMPL_SENDER_FINE ( ISoundStreamServer, notifyCaptureChannelsChanged, (const TQString &client_id, const TQStringList &map), + noticeCaptureChannelsChanged (client_id, map) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, querySoundStreamDescription, (SoundStreamID id, TQString &descr), + getSoundStreamDescription(id, descr) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, querySoundStreamRadioStation, (SoundStreamID id, const RadioStation *&rs), + getSoundStreamRadioStation(id, rs) ); + +IF_IMPL_SENDER_FINE ( ISoundStreamServer, queryEnumerateSoundStreams, (TQMap<TQString, SoundStreamID> &list), + enumerateSoundStreams(list) ); + + + + +//////////////////////////////////////////// + + +ISoundStreamClient::ISoundStreamClient() + : BaseClass(1), + m_Server(NULL) +{ + setSoundStreamClientID(createNewSoundStreamClientID()); +} + + +ISoundStreamClient::~ISoundStreamClient() +{ +} + +TQString ISoundStreamClient::createNewSoundStreamClientID() +{ + const int buffersize = 32; + unsigned char buffer[buffersize]; + + TQString stime, srandom = TQString(); + stime.setNum(time(NULL)); + + int fd = open (dev_urandom, O_RDONLY); + read(fd, buffer, buffersize); + close(fd); + for (int i = 0; i < buffersize; ++i) + srandom += TQString().sprintf("%02X", (unsigned int)buffer[i]); + + return stime + srandom; +} + + + +void ISoundStreamClient::setSoundStreamClientID(const TQString &s) +{ + ISoundStreamServer *server = getSoundStreamServer(); + if (server) + server->noticeDisconnectedI(this, true); + m_SoundStreamClientID = s; + if (server) + server->noticeConnectedI(this, true); +} + + +const TQString &ISoundStreamClient::getSoundStreamClientID() const +{ + return m_SoundStreamClientID; +} + + + +void ISoundStreamClient::noticeConnectedI(cmplInterface *i, bool valid) +{ + if (valid && i) + m_Server = i; +} + +void ISoundStreamClient::noticeDisconnectedI(cmplInterface *i, bool /*valid*/) +{ + if (i == m_Server) { + m_Server = NULL; + } +} + + +SoundStreamID ISoundStreamClient::createNewSoundStream(bool notify) const +{ + SoundStreamID x = SoundStreamID::createNewID(); + if (iConnections.count() && notify) + iConnections.getFirst()->notifySoundStreamCreated(x); + return x; +} + + +SoundStreamID ISoundStreamClient::createNewSoundStream(SoundStreamID old_id, bool notify) const +{ + SoundStreamID x = SoundStreamID::createNewID(old_id); + if (iConnections.count() && notify) + iConnections.getFirst()->notifySoundStreamCreated(x); + return x; +} + + +void ISoundStreamClient::closeSoundStream(SoundStreamID id, bool notify) +{ + if (iConnections.count() && notify) + iConnections.getFirst()->notifySoundStreamClosed(id); +} + + +static const TQStringList emptyList; + +const TQStringList &ISoundStreamClient::getPlaybackChannels() const +{ + return emptyList; +} + + +const TQStringList &ISoundStreamClient::getCaptureChannels() const +{ + return emptyList; +} + + +static const TQMap<TQString, ISoundStreamClient *> emptyClientMap; +TQMap<TQString, ISoundStreamClient *> ISoundStreamClient::getPlaybackClients() const +{ + return iConnections.count() ? iConnections.getFirst()->getPlaybackClients() : emptyClientMap; +} + +TQMap<TQString, ISoundStreamClient *> ISoundStreamServer::getPlaybackClients() const +{ + TQMap<TQString, ISoundStreamClient *> map; + for (TQPtrListIterator<ISoundStreamClient> it(ISoundStreamServer::iConnections); it.current(); ++it) { + if (it.current()->supportsPlayback()) + map.insert(it.current()->getSoundStreamClientID(), it.current()); + } + return map; +} + + + +static const TQMap<TQString, TQString> emptyClientDescrMap; +TQMap<TQString, TQString> ISoundStreamClient::getPlaybackClientDescriptions() const +{ + return iConnections.count() ? iConnections.getFirst()->getPlaybackClientDescriptions() : emptyClientDescrMap; +} + +TQMap<TQString, TQString> ISoundStreamServer::getPlaybackClientDescriptions() const +{ + TQMap<TQString, TQString> map; + for (TQPtrListIterator<ISoundStreamClient> it(ISoundStreamServer::iConnections); it.current(); ++it) { + if (it.current()->supportsPlayback()) + map.insert(it.current()->getSoundStreamClientID(), it.current()->getSoundStreamClientDescription()); + } + return map; +} + + + + +TQMap<TQString, ISoundStreamClient *> ISoundStreamClient::getCaptureClients() const +{ + return iConnections.count() ? iConnections.getFirst()->getCaptureClients() : emptyClientMap; +} + + +TQMap<TQString, ISoundStreamClient *> ISoundStreamServer::getCaptureClients() const +{ + TQMap<TQString, ISoundStreamClient *> map; + for (TQPtrListIterator<ISoundStreamClient> it(ISoundStreamServer::iConnections); it.current(); ++it) { + if (it.current()->supportsCapture()) + map.insert(it.current()->getSoundStreamClientID(), it.current()); + } + return map; +} + + + + +TQMap<TQString, TQString> ISoundStreamClient::getCaptureClientDescriptions() const +{ + return iConnections.count() ? iConnections.getFirst()->getCaptureClientDescriptions() : emptyClientDescrMap; +} + +TQMap<TQString, TQString> ISoundStreamServer::getCaptureClientDescriptions() const +{ + TQMap<TQString, TQString> map; + for (TQPtrListIterator<ISoundStreamClient> it(ISoundStreamServer::iConnections); it.current(); ++it) { + if (it.current()->supportsCapture()) + map.insert(it.current()->getSoundStreamClientID(), it.current()->getSoundStreamClientDescription()); + } + return map; +} + + + + + +ISoundStreamClient *ISoundStreamClient::getSoundStreamClientWithID(const TQString &search_id) const +{ + return iConnections.count() ? iConnections.getFirst()->getSoundStreamClientWithID(search_id) : NULL; +} + +ISoundStreamClient *ISoundStreamServer::getSoundStreamClientWithID(const TQString &search_id) const +{ + for (TQPtrListIterator<ISoundStreamClient> it(ISoundStreamServer::iConnections); it.current(); ++it) { + const TQString &id = it.current()->getSoundStreamClientID(); + if (id == search_id) + return it.current(); + } + return NULL; +} + +void ISoundStreamClient::noticeConnectedSoundClient(thisInterface */*i*/, bool /*pointer_valid*/) +{ +} + +void ISoundStreamClient::noticeDisconnectedSoundClient(thisInterface */*i*/, bool /*pointer_valid*/) +{ +} + +static const TQPtrList<ISoundStreamClient> emptyClientList; +IF_IMPL_QUERY ( TQPtrList<ISoundStreamClient> ISoundStreamClient::queryPlaybackMixers(), + getPlaybackMixers(), + emptyClientList ); + +IF_IMPL_QUERY ( TQPtrList<ISoundStreamClient> ISoundStreamClient::queryCaptureMixers(), + getPlaybackMixers(), + emptyClientList ); |