summaryrefslogtreecommitdiffstats
path: root/src/soundstreamclient_interfaces.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/soundstreamclient_interfaces.cpp')
-rw-r--r--src/soundstreamclient_interfaces.cpp426
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 );