diff options
Diffstat (limited to 'tderadio3/plugins/alsa-sound/alsa-sound.cpp')
-rw-r--r-- | tderadio3/plugins/alsa-sound/alsa-sound.cpp | 1562 |
1 files changed, 0 insertions, 1562 deletions
diff --git a/tderadio3/plugins/alsa-sound/alsa-sound.cpp b/tderadio3/plugins/alsa-sound/alsa-sound.cpp deleted file mode 100644 index 746eacf..0000000 --- a/tderadio3/plugins/alsa-sound/alsa-sound.cpp +++ /dev/null @@ -1,1562 +0,0 @@ -/*************************************************************************** - alsa-sound.cpp - description - ------------------- - begin : Thu May 26 2005 - copyright : (C) 2005 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 <tdelocale.h> -#include <tdeaboutdata.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/ioctl.h> -#include <fcntl.h> -#include <unistd.h> -#include <math.h> -#include <errno.h> - -#include <sys/soundcard.h> -#include <alsa/asoundlib.h> - -#include "alsa-sound.h" -#include "alsa-sound-configuration.h" -// #include "capture-thread.h" -#include "../../src/include/aboutwidget.h" -#include "../../src/include/utils.h" - -/////////////////////////////////////////////////////////////////////// -//// plugin library functions - -PLUGIN_LIBRARY_FUNCTIONS(AlsaSoundDevice, "tderadio-alsa-sound", i18n("Advanced Linux Sound Architecture (ALSA) Support")); - -///////////////////////////////////////////////////////////////////////////// - -struct _lrvol { unsigned char l, r; short dummy; }; - -AlsaSoundDevice::AlsaSoundDevice(const TQString &name) - : TQObject(NULL, NULL), - PluginBase(name, i18n("TDERadio ALSA Sound Plugin")), - m_hPlayback(NULL), - m_hCapture(NULL), - m_hPlaybackMixer(NULL), - m_hCaptureMixer(NULL), - m_PlaybackFormat(), - m_CaptureFormat(), - m_PlaybackCard(-1), - m_PlaybackDevice(-1), - m_CaptureCard(-1), - m_CaptureDevice(-1), - m_PlaybackLatency(50), - m_CaptureLatency(50), - m_PassivePlaybackStreams(), - m_PlaybackStreamID(), - m_CaptureStreamID(), - m_HWBufferSize(2048), - m_BufferSize(16384), - m_PlaybackBuffer(m_BufferSize), - m_CaptureBuffer(m_BufferSize), - m_CaptureRequestCounter(0), - m_CapturePos(0), - m_CaptureStartTime(0), -// m_PlaybackSkipCount(0), - m_CaptureSkipCount(0), - m_EnablePlayback(true), - m_EnableCapture(true)//, -// m_captureThread(NULL) -{ - TQObject::connect(&m_PlaybackPollingTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotPollPlayback())); - TQObject::connect(&m_CapturePollingTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotPollCapture())); -} - - -AlsaSoundDevice::~AlsaSoundDevice() -{ - stopCapture(m_CaptureStreamID); - stopPlayback(m_PlaybackStreamID); - closePlaybackDevice(); - closeCaptureDevice(); - closePlaybackMixerDevice(); - closeCaptureMixerDevice(); -} - - -bool AlsaSoundDevice::connectI(Interface *i) -{ - bool a = PluginBase::connectI(i); - bool b = ISoundStreamClient::connectI(i); - return a || b; -} - - -bool AlsaSoundDevice::disconnectI(Interface *i) -{ - bool a = PluginBase::disconnectI(i); - bool b = ISoundStreamClient::disconnectI(i); - return a || b; -} - -void AlsaSoundDevice::noticeConnectedI (ISoundStreamServer *s, bool pointer_valid) -{ - ISoundStreamClient::noticeConnectedI(s, pointer_valid); - if (s && pointer_valid) { - s->register4_sendReleasePlayback(this); - s->register4_sendReleaseCapture(this); - s->register4_sendPlaybackVolume(this); - s->register4_sendMute(this); - s->register4_sendUnmute(this); - s->register4_sendCaptureVolume(this); - s->register4_queryPlaybackVolume(this); - s->register4_queryCaptureVolume(this); - s->register4_sendStartPlayback(this); - s->register4_sendPausePlayback(this); - s->register4_sendStopPlayback(this); - s->register4_queryIsPlaybackRunning(this); - s->register4_sendStartCaptureWithFormat(this); - s->register4_sendStopCapture(this); - s->register4_queryIsCaptureRunning(this); - s->register4_notifySoundStreamClosed(this); - s->register4_notifySoundStreamRedirected(this); - s->register4_notifySoundStreamData(this); - } -} - -// PluginBase - -void AlsaSoundDevice::saveState (TDEConfig *c) const -{ - c->setGroup(TQString("alsa-sound-") + PluginBase::name()); - - c->writeEntry("playback-card", m_PlaybackCard); - c->writeEntry("playback-device", m_PlaybackDevice); - c->writeEntry("capture-card", m_CaptureCard); - c->writeEntry("capture-device", m_CaptureDevice); - c->writeEntry("enable-playback", m_EnablePlayback); - c->writeEntry("enable-capture", m_EnableCapture); - c->writeEntry("hwbuffer-size", m_HWBufferSize); - c->writeEntry("buffer-size", m_BufferSize); - c->writeEntry("soundstreamclient-id", m_SoundStreamClientID); - - c->writeEntry("mixer-settings", m_CaptureMixerSettings.count()); - int i = 0; - for (TQMapConstIterator<TQString, AlsaConfigMixerSetting> it = m_CaptureMixerSettings.begin(); it != m_CaptureMixerSettings.end(); ++it, ++i) { - - TQString prefix = TQString("mixer-setting-%1-").arg(i); - (*it).saveState(c, prefix); - } - -} - - -void AlsaSoundDevice::restoreState (TDEConfig *c) -{ - c->setGroup(TQString("alsa-sound-") + PluginBase::name()); - - m_EnablePlayback = c->readBoolEntry("enable-playback", true); - m_EnableCapture = c->readBoolEntry("enable-capture", true); - m_HWBufferSize = c->readNumEntry ("hwbuffer-size", 2048); - m_BufferSize = c->readNumEntry ("buffer-size", 16384); - int card = c->readNumEntry ("playback-card", 0); - int dev = c->readNumEntry ("playback-device", 0); - setPlaybackDevice(card, dev); - card = c->readNumEntry ("capture-card", 0); - dev = c->readNumEntry ("capture-device", 0); - setCaptureDevice(card, dev); - - m_PlaybackBuffer.resize(m_BufferSize); - m_CaptureBuffer.resize(m_BufferSize); - - setSoundStreamClientID(c->readEntry("soundstreamclient-id", getSoundStreamClientID())); - - int n = c->readNumEntry("mixer-settings", 0); - for (int i = 0; i < n; ++i) { - TQString prefix = TQString("mixer-setting-%1-").arg(i); - AlsaConfigMixerSetting s(c, prefix); - m_CaptureMixerSettings.insert(s.getIDString(), s); - } - - emit sigUpdateConfig(); -} - - -ConfigPageInfo AlsaSoundDevice::createConfigurationPage() -{ - AlsaSoundConfiguration *conf = new AlsaSoundConfiguration(NULL, this); - TQObject::connect(this, TQT_SIGNAL(sigUpdateConfig()), conf, TQT_SLOT(slotUpdateConfig())); - return ConfigPageInfo (conf, - i18n("ALSA Sound"), - i18n("ALSA Sound Device Options"), - "tderadio_alsa2"); -} - - -AboutPageInfo AlsaSoundDevice::createAboutPage() -{ -/* TDEAboutData aboutData("tderadio", - NULL, - NULL, - I18N_NOOP("ALSA Sound Plugin for TDERadio"), - TDEAboutData::License_GPL, - "(c) 2005 Martin Witte", - 0, - "http://sourceforge.net/projects/tderadio", - 0); - aboutData.addAuthor("Martin Witte", "", "witte@kawo1.rwth-aachen.de"); - - return AboutPageInfo( - new TDERadioAboutWidget(aboutData, TDERadioAboutWidget::AbtTabbed), - i18n("ALSA Sound"), - i18n("ALSA Sound"), - "tderadio_alsa_sound" - ); -*/ - return AboutPageInfo(); -} - - - -bool AlsaSoundDevice::preparePlayback(SoundStreamID id, const TQString &channel, bool active_mode, bool start_immediately) -{ - if (id.isValid()) { - m_PlaybackStreams.insert(id, SoundStreamConfig(channel, active_mode)); - if (start_immediately) - startPlayback(id); - return true; - // FIXME: what to do if stream is already playing? - } - return false; -} - -bool AlsaSoundDevice::prepareCapture(SoundStreamID id, const TQString &channel) -{ - if (id.isValid()) { - m_CaptureStreams.insert(id, SoundStreamConfig(channel)); - return true; - // FIXME: what to do if stream is already playing? - } - return false; -} - -bool AlsaSoundDevice::releasePlayback(SoundStreamID id) -{ - if (id.isValid() && m_PlaybackStreams.contains(id)) { - if (m_PlaybackStreamID == id || m_PassivePlaybackStreams.contains(id)) { - stopPlayback(id); - } - m_PlaybackStreams.remove(id); - return true; - } - return false; -} - -bool AlsaSoundDevice::releaseCapture(SoundStreamID id) -{ - if (id.isValid() && m_CaptureStreams.contains(id)) { - if (m_CaptureStreamID == id) { - stopCapture(id); - } - m_CaptureStreams.remove(id); - return true; - } - return false; -} - -bool AlsaSoundDevice::supportsPlayback() const -{ - return m_EnablePlayback; -} - - -bool AlsaSoundDevice::supportsCapture() const -{ - return m_EnableCapture; -} - - -bool AlsaSoundDevice::startPlayback(SoundStreamID id) -{ - if (id.isValid() && m_PlaybackStreams.contains(id) && m_EnablePlayback) { - - SoundStreamConfig &cfg = m_PlaybackStreams[id]; - - bool ok = false; - if (cfg.m_ActiveMode) { - if (!m_PlaybackStreamID.isValid()) { - m_PlaybackStreamID = id; - ok = true; - } - } else { - if (!m_PassivePlaybackStreams.contains(id)) - m_PassivePlaybackStreams.append(id); - ok = true; - } - - if (ok) { - openPlaybackMixerDevice(); - if (cfg.m_Volume >= 0 && writePlaybackMixerVolume(cfg.m_Channel, cfg.m_Volume, cfg.m_Muted)) { - notifyPlaybackVolumeChanged(id, cfg.m_Volume); - notifyMuted(id, cfg.m_Volume); - } - m_PlaybackPollingTimer.start(m_PlaybackLatency); - } - - // error handling? - return true; - } else { - return false; - } -} - - -bool AlsaSoundDevice::pausePlayback(SoundStreamID /*id*/) -{ - //return stopPlayback(id); - return false; -} - - -bool AlsaSoundDevice::stopPlayback(SoundStreamID id) -{ - if (id.isValid() && m_PlaybackStreams.contains(id)) { - - SoundStreamConfig &cfg = m_PlaybackStreams[id]; - - if (!cfg.m_ActiveMode) { - if (m_PassivePlaybackStreams.contains(id)) { -/* float tmp = 0; - writePlaybackMixerVolume(cfg.m_Channel, tmp, true);*/ - m_PassivePlaybackStreams.remove(id); - } - } else if (m_PlaybackStreamID == id) { - m_PlaybackStreamID = SoundStreamID::InvalidID; - m_PlaybackBuffer.clear(); - closePlaybackDevice(); - } - - closePlaybackMixerDevice(); - return true; - } else { - return false; - } -} - -bool AlsaSoundDevice::isPlaybackRunning(SoundStreamID id, bool &b) const -{ - if (id.isValid() && m_PlaybackStreamID == id || m_PassivePlaybackStreams.contains(id)) { - b = true; - return true; - } else { - return false; - } -} - -bool AlsaSoundDevice::startCaptureWithFormat(SoundStreamID id, - const SoundFormat &proposed_format, - SoundFormat &real_format, - bool force_format) -{ - if (m_CaptureStreams.contains(id) && m_EnableCapture) { - - if (m_CaptureStreamID != id) { - m_CapturePos = 0; - m_CaptureStartTime = time(NULL); - } - - if (m_CaptureStreamID != id || (force_format && proposed_format != m_CaptureFormat)) { - - m_CaptureStreamID = id; - SoundStreamConfig &cfg = m_CaptureStreams[id]; - - openCaptureMixerDevice(); - selectCaptureChannel(cfg.m_Channel); - if (cfg.m_Volume >= 0 && writeCaptureMixerVolume(cfg.m_Channel, cfg.m_Volume)) { - notifyCaptureVolumeChanged(m_CaptureStreamID, cfg.m_Volume); - } - - openCaptureDevice(proposed_format); - - // FIXME: error handling? - } - - real_format = m_CaptureFormat; - m_CaptureRequestCounter++; - -// m_captureThread = new AlsaCaptureThread(this, m_hCapture, m_CaptureFormat, 5, m_BufferSize); -// m_captureThread->start(); - - slotPollCapture(); - - return true; - } else { - return false; - } -} - - -bool AlsaSoundDevice::stopCapture(SoundStreamID id) -{ - if (id.isValid() && m_CaptureStreamID == id) { - - if (--m_CaptureRequestCounter == 0) { - -// m_captureThread->setDone(); -// if (!m_captureThread->wait(4000)) { //wait at maximum 4 seconds -// logError("AlsaPlugin: capture thread did not terminate. Killing it."); -// m_captureThread->terminate(); -// m_captureThread->wait(); -// } - - slotPollCapture(); - -// if (m_captureThread->error()) { -// logError(i18n("ALSA Plugin, device plughw:%1,%2: %3").arg(m_CaptureCard) -// .arg(m_CaptureDevice) -// .arg(i18n("unknown error"))); -// } -// -// delete m_captureThread; -// m_captureThread = NULL; - - m_CaptureStreamID = SoundStreamID::InvalidID; - m_CaptureBuffer.clear(); - - closeCaptureMixerDevice(); - closeCaptureDevice(); - } - return true; - } else { - return false; - } -} - - -bool AlsaSoundDevice::isCaptureRunning(SoundStreamID id, bool &b, SoundFormat &sf) const -{ - if (id.isValid() && m_CaptureStreamID == id) { - b = true; - sf = m_CaptureFormat; - return true; - } else { - return false; - } -} - - -bool AlsaSoundDevice::noticeSoundStreamClosed(SoundStreamID id) -{ - bool found = false; - if (m_PlaybackStreamID == id || m_PassivePlaybackStreams.contains(id)) { - stopPlayback(id); - found = true; - } - if (m_CaptureStreamID == id) { - stopCapture(id); - found = true; - } - m_PlaybackStreams.remove(id); - m_CaptureStreams.remove(id); - return found; -} - - -bool AlsaSoundDevice::noticeSoundStreamRedirected(SoundStreamID oldID, SoundStreamID newID) -{ - bool found = false; - if (m_PlaybackStreams.contains(oldID)) { - m_PlaybackStreams.insert(newID, m_PlaybackStreams[oldID]); - if (newID != oldID) - m_PlaybackStreams.remove(oldID); - found = true; - } - if (m_CaptureStreams.contains(oldID)) { - m_CaptureStreams.insert(newID, m_CaptureStreams[oldID]); - if (newID != oldID) - m_CaptureStreams.remove(oldID); - found = true; - } - - if (m_PlaybackStreamID == oldID) - m_PlaybackStreamID = newID; - if (m_CaptureStreamID == oldID) - m_CaptureStreamID = newID; - if (m_PassivePlaybackStreams.contains(oldID)) { - m_PassivePlaybackStreams.remove(oldID); - m_PassivePlaybackStreams.append(newID); - } - return found; -} - - -bool AlsaSoundDevice::noticeSoundStreamData(SoundStreamID id, - const SoundFormat &format, - const char *data, size_t size, size_t &consumed_size, - const SoundMetaData &/*md*/ - ) -{ - if (!id.isValid() || id != m_PlaybackStreamID) - return false; - - if (!m_hPlayback) { - openPlaybackDevice(format); - } else if (format != m_PlaybackFormat) { - // flush playback buffer - size_t buffersize = 0; - char *buffer = m_PlaybackBuffer.getData(buffersize); - - snd_pcm_writei(m_hPlayback, buffer, buffersize / m_PlaybackFormat.sampleSize()); - - // if not all could be written, it must be discarded - m_PlaybackBuffer.clear(); - closePlaybackDevice(); - openPlaybackDevice(format); - // error handling ? - } - - size_t n = m_PlaybackBuffer.addData(data, size); - consumed_size = (consumed_size == SIZE_T_DONT_CARE) ? n : min (consumed_size, n); -/* if (n < size) { - m_PlaybackSkipCount += size - n; - } else if (m_PlaybackSkipCount > 0) { - logWarning(i18n("plughw:%1,%2: Playback buffer overflow. Skipped %3 bytes").arg(m_PlaybackCard).arg(m_PlaybackDevice).arg(TQString::number(m_PlaybackSkipCount))); - m_PlaybackSkipCount = 0; - } - return m_PlaybackSkipCount == 0;*/ - return true; -} - - - -void AlsaSoundDevice::slotPollPlayback() -{ - if (m_PlaybackStreamID.isValid()) { - - if (m_PlaybackBuffer.getFillSize() > 0 && m_hPlayback) { - - size_t buffersize = 0; - int frameSize = m_CaptureFormat.frameSize(); - char *buffer = m_PlaybackBuffer.getData(buffersize); - int framesWritten = snd_pcm_writei(m_hPlayback, buffer, buffersize / frameSize); - int bytesWritten = framesWritten * frameSize; - - if (framesWritten > 0) { - m_PlaybackBuffer.removeData(bytesWritten); - } else if (framesWritten == 0) { - logError(i18n("ALSA Plugin: cannot write data for device plughw:%1,%2").arg(m_PlaybackCard).arg(m_PlaybackDevice)); - } else if (framesWritten == -EAGAIN) { - // do nothing - } else { - snd_pcm_prepare(m_hPlayback); - logWarning(i18n("ALSA Plugin: buffer underrun for device plughw:%1,%2").arg(m_PlaybackCard).arg(m_PlaybackDevice)); - } - } - - if (m_PlaybackBuffer.getFreeSize() > m_PlaybackBuffer.getSize() / 3) { - notifyReadyForPlaybackData(m_PlaybackStreamID, m_PlaybackBuffer.getFreeSize()); - } - - checkMixerVolume(m_PlaybackStreamID); - } - - TQValueListConstIterator<SoundStreamID> end = m_PassivePlaybackStreams.end(); - for (TQValueListConstIterator<SoundStreamID> it = m_PassivePlaybackStreams.begin(); it != end; ++it) - checkMixerVolume(*it); -} - - -void AlsaSoundDevice::slotPollCapture() -{ - if (m_CaptureStreamID.isValid() && m_hCapture) { - -// while (m_captureThread && m_captureThread->getAvailableReadBuffers()) { -// TQString dev = TQString("alsa://plughw:%1,%2").arg(m_CaptureCard).arg(m_CaptureDevice); -// size_t size = 0; -// char *buffer = m_captureThread->getReadBuffer(size); -// time_t cur_time = time(NULL); -// notifySoundStreamData(m_CaptureStreamID, m_CaptureFormat, buffer, size, SoundMetaData(m_CapturePos, cur_time - m_CaptureStartTime, cur_time, dev)); -// m_CapturePos += size; -// } - - size_t bufferSize = 0; - char *buffer = m_CaptureBuffer.getFreeSpace(bufferSize); - - if (bufferSize) { - - size_t frameSize = m_CaptureFormat.frameSize(); - int framesRead = snd_pcm_readi(m_hCapture, buffer, bufferSize / frameSize); - size_t bytesRead = framesRead > 0 ? framesRead * frameSize : 0; - -// //BEGIN DEBUG -// static unsigned int debug_val = 0; -// short *debug_buf = (short*)buffer; -// for (int i = 0; i < bytesRead / 2 / sizeof(short); ++i) { -// debug_buf[2*i] = debug_val >> 10; -// debug_buf[2*i+1] = debug_val >> 10; -// ++debug_val; -// } -// //END DEBUG - - if (framesRead > 0) { - m_CaptureBuffer.removeFreeSpace(bytesRead); - } else if (framesRead == 0) { - snd_pcm_prepare(m_hCapture); - logError(i18n("ALSA Plugin: cannot read data from device plughw:%1,%2").arg(m_CaptureCard).arg(m_CaptureDevice)); - } else if (framesRead == -EAGAIN) { - // do nothing - } else { - snd_pcm_prepare(m_hCapture); - logWarning(i18n("ALSA Plugin: buffer overrun for device plughw:%1,%2 (buffersize=%3, buffer=%4)").arg(m_CaptureCard).arg(m_CaptureDevice).arg(bufferSize).arg((long long unsigned)buffer)); - } - - TQString dev = TQString("alsa://plughw:%1,%2").arg(m_CaptureCard).arg(m_CaptureDevice); - while (m_CaptureBuffer.getFillSize() > m_CaptureBuffer.getSize() / 3) { - size_t size = 0; - buffer = m_CaptureBuffer.getData(size); - time_t cur_time = time(NULL); - size_t consumed_size = SIZE_T_DONT_CARE; - - notifySoundStreamData(m_CaptureStreamID, m_CaptureFormat, buffer, size, consumed_size, SoundMetaData(m_CapturePos, cur_time - m_CaptureStartTime, cur_time, i18n("internal stream, not stored (%1)").arg(dev))); - - if (consumed_size == SIZE_T_DONT_CARE) - consumed_size = size; - m_CaptureBuffer.removeData(consumed_size); - m_CapturePos += consumed_size; - if (consumed_size < size) - break; - } - } - } - if (m_CaptureStreamID.isValid()) - checkMixerVolume(m_CaptureStreamID); -} - - -bool AlsaSoundDevice::openPlaybackDevice(const SoundFormat &format, bool reopen) -{ - if (m_PlaybackCard < 0 || m_PlaybackDevice < 0) - return false; - - if (m_hPlayback) { - - if (reopen) { - - closePlaybackDevice ( /* force = */ true); - - } else { - - if (format != m_PlaybackFormat) - return false; - - return true; - } - } else { - if (reopen) // FIXME: emw: please check if this makes sense !?!? - return true; - } - - m_PlaybackFormat = format; - - TQString dev = TQString("plughw:%1,%2").arg(m_PlaybackCard).arg(m_PlaybackDevice); - bool error = !openAlsaDevice(m_hPlayback, m_PlaybackFormat, dev.ascii(), SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK, m_PlaybackLatency); - - if (!error) { - m_PlaybackPollingTimer.start(m_PlaybackLatency); - } else { - closePlaybackDevice(); - } - -// m_PlaybackSkipCount = 0; - - return !error; -} - - -bool AlsaSoundDevice::openCaptureDevice(const SoundFormat &format, bool reopen) -{ - if (m_PlaybackCard < 0 || m_PlaybackDevice < 0) - return false; - - if (m_hCapture) { - - if (reopen) { - - closeCaptureDevice ( /* force = */ true); - - } else { - - if (format != m_CaptureFormat) - return false; - - return true; - } - } else { - if (reopen) // FIXME: emw: please check if this makes sense !?!? - return true; - } - - m_CaptureFormat = format; - - TQString dev = TQString("plughw:%1,%2").arg(m_CaptureCard).arg(m_CaptureDevice); -// bool error = !openAlsaDevice(m_hCapture, m_CaptureFormat, dev.ascii(), SND_PCM_STREAM_CAPTURE, /*flags = block*/0, m_CaptureLatency); - bool error = !openAlsaDevice(m_hCapture, m_CaptureFormat, dev.ascii(), SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK, m_CaptureLatency); - - if (!error) { - m_CapturePollingTimer.start(m_CaptureLatency); - } else { - closeCaptureDevice(); - } - - m_CaptureSkipCount = 0; - - return !error; -} - - -bool AlsaSoundDevice::openAlsaDevice(snd_pcm_t *&alsa_handle, SoundFormat &format, const char *pcm_name, snd_pcm_stream_t stream, int flags, unsigned &latency) -{ - bool error = false; - int dir = 0; - - snd_pcm_hw_params_t *hwparams = NULL; - - snd_pcm_hw_params_alloca(&hwparams); - - - /* OPEN */ - - if (!error && snd_pcm_open(&alsa_handle, pcm_name, stream, flags) < 0) { - logError(i18n("ALSA Plugin: Error opening PCM device %1").arg(pcm_name)); - error = true; - } - - if (!error && snd_pcm_hw_params_any(alsa_handle, hwparams) < 0) { - logError(i18n("ALSA Plugin: Can not configure PCM device %1").arg(pcm_name)); - error = true; - } - - /* interleaved access type */ - - if (!error && snd_pcm_hw_params_set_access(alsa_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) { - logError(i18n("ALSA Plugin: Error setting access for %1").arg(pcm_name)); - error = true; - } - - /* sample format */ - snd_pcm_format_t sample_format = snd_pcm_build_linear_format(format.m_SampleBits, - format.m_SampleBits, - !format.m_IsSigned, - format.m_Endianess == BIG_ENDIAN); - if (!error && snd_pcm_hw_params_set_format(alsa_handle, hwparams, sample_format) < 0) { - logError(i18n("ALSA Plugin: Error setting sample format for %1").arg(pcm_name)); - error = true; - } - - /* channels */ - if (!error && snd_pcm_hw_params_set_channels(alsa_handle, hwparams, format.m_Channels) < 0) { - logError(i18n("ALSA Plugin: Error setting channels for %1").arg(pcm_name)); - error = true; - } - - /* sample rate */ - int rate = format.m_SampleRate; - if (!error && snd_pcm_hw_params_set_rate_near(alsa_handle, hwparams, &format.m_SampleRate, &dir) < 0) { - logError(i18n("ALSA Plugin: Error setting rate for %1").arg(pcm_name)); - error = true; - } - if (!error && format.m_SampleRate != format.m_SampleRate) { - logWarning(i18n("ALSA Plugin: The rate %1 Hz is not supported by your hardware %2. Using %3 Hz instead").arg(rate).arg(pcm_name).arg(format.m_SampleRate)); - } - - - snd_pcm_uframes_t period_size = m_HWBufferSize / format.frameSize(); - if (!error && snd_pcm_hw_params_set_period_size_near(alsa_handle, hwparams, &period_size, &dir) < 0) { - logError(i18n("ALSA Plugin: Error setting period size for %1").arg(pcm_name)); - error = true; - } - -// size_t buffersize_frames = m_HWBufferSize / format.frameSize(); -// int periods = 4; -// //int period_size = m_BufferSize / periods; -// -// /* fragments */ -// if (!error && snd_pcm_hw_params_set_periods(alsa_handle, hwparams, periods, 0) < 0) { -// logError(i18n("ALSA Plugin: Error setting periods for %1").arg(pcm_name)); -// error = true; -// } - -// /* Set buffer size (in frames). */ -// -// snd_pcm_uframes_t exact_buffersize_frames = buffersize_frames; -// if (!error && snd_pcm_hw_params_set_buffer_size_near(alsa_handle, hwparams, &exact_buffersize_frames) < 0) { -// exact_buffersize_frames = 4096; -// if (!error && snd_pcm_hw_params_set_buffer_size_near(alsa_handle, hwparams, &exact_buffersize_frames) < 0) { -// logError(i18n("ALSA Plugin: Error setting buffersize for %1").arg(pcm_name)); -// error = true; -// } -// } - -// size_t exact_buffersize = exact_buffersize_frames * format.frameSize(); -// if (!error && m_HWBufferSize != exact_buffersize) { -// logWarning(i18n("ALSA Plugin: Hardware %1 does not support buffer size of %2. Using buffer size of %3 instead.").arg(pcm_name).arg(m_HWBufferSize).arg(exact_buffersize)); -// size_t tmp = (((m_HWBufferSize - 1) / exact_buffersize) + 1) * exact_buffersize; -// setHWBufferSize(tmp); -// logInfo(i18n("ALSA Plugin: adjusted buffer size for %1 to %2 bytes").arg(pcm_name).arg(TQString::number(tmp))); -// } - - /* set all params */ - - if (!error && snd_pcm_hw_params(alsa_handle, hwparams) < 0) { - logError(i18n("ALSA Plugin: Error setting HW params")); - error = true; - } - - if (!error && snd_pcm_hw_params_get_period_size(hwparams, &period_size, &dir) < 0) { - logError(i18n("ALSA Plugin: Error getting period size for %1").arg(pcm_name)); - error = true; - } - -// latency = (exact_buffersize_frames * 1000) / format.m_SampleRate / periods; /* in milli seconds */ - latency = (period_size * format.frameSize() * 1000) / format.m_SampleRate; /* in milli seconds */ - - if (!error) { - snd_pcm_prepare(alsa_handle); - } - - return !error; -} - - -bool AlsaSoundDevice::closePlaybackDevice(bool force) -{ - if (!m_PlaybackStreamID.isValid() || force) { - - if (!m_hPlaybackMixer) - m_PlaybackPollingTimer.stop(); - - if (m_hPlayback) { - snd_pcm_drop(m_hPlayback); - snd_pcm_close(m_hPlayback); - } - - m_hPlayback = NULL; - - m_PlaybackBuffer.clear(); - return true; - } - return false; -} - - -bool AlsaSoundDevice::closeCaptureDevice(bool force) -{ - if (!m_CaptureStreamID.isValid() || force) { - - if (!m_hCaptureMixer) - m_CapturePollingTimer.stop(); - - if (m_hCapture) { - snd_pcm_drop(m_hCapture); - snd_pcm_close(m_hCapture); - } - - m_hCapture = NULL; - - m_CaptureBuffer.clear(); - return true; - } - return false; -} - - -bool AlsaSoundDevice::openPlaybackMixerDevice(bool reopen) -{ - return openMixerDevice(m_hPlaybackMixer, m_PlaybackCard, reopen, &m_PlaybackPollingTimer, m_PlaybackLatency); -} - - -bool AlsaSoundDevice::openCaptureMixerDevice(bool reopen) -{ -// logDebug("AlsaSoundDevice::openCaptureMixerDevice: card == " + TQString::number(m_CaptureCard)); - return openMixerDevice(m_hCaptureMixer, m_CaptureCard, reopen, &m_CapturePollingTimer, m_CaptureLatency); -} - - -bool AlsaSoundDevice::closePlaybackMixerDevice(bool force) -{ - return closeMixerDevice(m_hPlaybackMixer, m_PlaybackCard, m_PlaybackStreamID, m_hPlayback, force, &m_PlaybackPollingTimer); -} - -bool AlsaSoundDevice::closeCaptureMixerDevice(bool force) -{ - return closeMixerDevice(m_hCaptureMixer, m_CaptureCard, m_CaptureStreamID, m_hCapture, force, &m_CapturePollingTimer); -} - - -static int mixer_dummy_callback(snd_mixer_t *, unsigned int /*mask*/, snd_mixer_elem_t */*elem*/) -{ - return 0; -} - -bool AlsaSoundDevice::openMixerDevice(snd_mixer_t *&mixer_handle, int card, bool reopen, TQTimer *timer, int timer_latency) -{ - if (reopen) { - if (mixer_handle != NULL) - closeMixerDevice(mixer_handle, card, SoundStreamID::InvalidID, NULL, /* force = */ true, timer); - else - return true; - } - - if (!mixer_handle) { - bool error = false; - if (snd_mixer_open (&mixer_handle, 0) < 0) { - staticLogError(i18n("ALSA Plugin: Error opening mixer")); - error = true; - } - TQString cardid = "hw:" + TQString::number(card); - bool attached = false; - if (!error) { - if (snd_mixer_attach (mixer_handle, cardid.ascii()) < 0) { - staticLogError(i18n("ALSA Plugin: ERROR: snd_mixer_attach for card %1").arg(card)); - error = true; - } else { - attached = true; - } - } - if (!error && snd_mixer_selem_register(mixer_handle, NULL, NULL) < 0) { - staticLogError(i18n("ALSA Plugin: Error: snd_mixer_selem_register for card %1").arg(card)); - error = true; - } - if (!error && snd_mixer_load (mixer_handle) < 0) { - staticLogError(i18n("ALSA Plugin: Error: snd_mixer_load for card %1").arg(card)); - error = true; - } - if (mixer_handle) { - snd_mixer_set_callback (mixer_handle, mixer_dummy_callback); - } - - if (error) { - if (attached) { - snd_mixer_detach(mixer_handle, cardid.ascii()); - } - snd_mixer_close(mixer_handle); - mixer_handle = NULL; - } - } - - if (mixer_handle && timer) { - timer->start(timer_latency); - } - return mixer_handle != NULL; -} - - -bool AlsaSoundDevice::closeMixerDevice(snd_mixer_t *&mixer_handle, int card, SoundStreamID id, snd_pcm_t *pcm_handle, bool force, TQTimer *timer) -{ - if (!id.isValid() || force) { - - if (!pcm_handle && timer) - timer->stop(); - - if (mixer_handle) { - TQString cardid = "hw:" + TQString::number(card); - snd_mixer_free(mixer_handle); - snd_mixer_detach(mixer_handle, cardid.ascii()); - snd_mixer_close (mixer_handle); - } - mixer_handle = NULL; - } - return mixer_handle == NULL; -} - -void AlsaSoundDevice::getPlaybackMixerChannels( - int card, - snd_mixer_t *__mixer_handle, - TQStringList &retval, TQMap<TQString, AlsaMixerElement> &ch2id) -{ - retval.clear(); - ch2id.clear(); - - snd_mixer_t *mixer_handle = __mixer_handle/*m_hPlaybackMixer*/; - bool use_tmp_handle = false; - - if (!mixer_handle) { - openMixerDevice(mixer_handle, card/*m_PlaybackCard*/, false, NULL, 0); - use_tmp_handle = true; - } - - if (mixer_handle) { - snd_mixer_elem_t *elem = NULL; - - for (elem = snd_mixer_first_elem(mixer_handle); elem; elem = snd_mixer_elem_next(elem)) { - AlsaMixerElement sid; - if (!snd_mixer_selem_is_active(elem)) - continue; - snd_mixer_selem_get_id(elem, sid); - TQString name = snd_mixer_selem_id_get_name(sid); - int idx = snd_mixer_selem_id_get_index(sid); - if (idx) - name = i18n("context-mixername-number", "%1 %2").arg(name).arg(idx); - if (snd_mixer_selem_has_playback_volume(elem)) { - ch2id[name] = sid; - retval.append(name); - } - } - } - - if (use_tmp_handle && mixer_handle) { - closeMixerDevice(mixer_handle, card /*m_PlaybackCard*/, SoundStreamID::InvalidID, NULL, true, NULL); - } -} - -void AlsaSoundDevice::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 -) -{ - vol_list.clear(); - sw_list.clear(); - if (all_list) all_list->clear(); - vol_ch2id.clear(); - sw_ch2id.clear(); - - snd_mixer_t *mixer_handle = __mixer_handle /*m_hCaptureMixer*/; - bool use_tmp_handle = false; - - if (!mixer_handle) { -// staticLogDebug("AlsaSoundDevice::getCaptureMixerChannels: card == " + TQString::number(card/*m_CaptureCard*/)); - openMixerDevice(mixer_handle, card /*m_CaptureCard*/, false, NULL, 0); - use_tmp_handle = true; - } - - if (mixer_handle) { - snd_mixer_elem_t *elem = NULL; - - for (elem = snd_mixer_first_elem(mixer_handle); elem; elem = snd_mixer_elem_next(elem)) { - AlsaMixerElement sid; - if (!snd_mixer_selem_is_active(elem)) - continue; - snd_mixer_selem_get_id(elem, sid); - TQString name = snd_mixer_selem_id_get_name(sid); - int idx = snd_mixer_selem_id_get_index(sid); - if (idx) - name = i18n("context-mixerelement-name-number", "%1 %2").arg(name).arg(idx); - - bool add2all = false; - if (snd_mixer_selem_has_capture_switch(elem)) { - sw_ch2id[name] = sid; - sw_list.append(name); - add2all = true; - } - if (snd_mixer_selem_has_capture_volume(elem)) { - vol_ch2id[name] = sid; - vol_list.append(name); - add2all = true; - } - if (add2all && all_list) { - all_list->append(name); - } - } - } - - if (use_tmp_handle && mixer_handle) { - closeMixerDevice(mixer_handle, card /*m_CaptureCard*/, SoundStreamID::InvalidID, NULL, true, NULL); - } -} - -const TQStringList &AlsaSoundDevice::getPlaybackChannels() const -{ - return m_PlaybackChannels; -} - - -const TQStringList &AlsaSoundDevice::getCaptureChannels() const -{ - return m_CaptureChannelsSwitch; -} - - -bool AlsaSoundDevice::setPlaybackVolume(SoundStreamID id, float volume) -{ - if (id.isValid() && (m_PlaybackStreamID == id || m_PassivePlaybackStreams.contains(id))) { - SoundStreamConfig &cfg = m_PlaybackStreams[id]; - - if (rint(100*volume) != rint(100*cfg.m_Volume)) { - if (writePlaybackMixerVolume(cfg.m_Channel, cfg.m_Volume = volume, cfg.m_Muted)) { - notifyPlaybackVolumeChanged(id, cfg.m_Volume); - } - } - return true; - } - return false; -} - - -bool AlsaSoundDevice::setCaptureVolume(SoundStreamID id, float volume) -{ - if (id.isValid() && m_CaptureStreamID == id) { - SoundStreamConfig &cfg = m_CaptureStreams[id]; - - if (rint(100*volume) != rint(100*cfg.m_Volume)) { - if (writeCaptureMixerVolume(cfg.m_Channel, cfg.m_Volume = volume)) { - notifyCaptureVolumeChanged(id, cfg.m_Volume); - } - } - return true; - } - return false; -} - - -bool AlsaSoundDevice::getPlaybackVolume(SoundStreamID id, float &volume) const -{ - if (id.isValid() && (m_PlaybackStreamID == id || m_PassivePlaybackStreams.contains(id))) { - const SoundStreamConfig &cfg = m_PlaybackStreams[id]; - volume = cfg.m_Volume; - return true; - } - return false; -} - - -bool AlsaSoundDevice::getCaptureVolume(SoundStreamID id, float &volume) const -{ - if (id.isValid() && m_CaptureStreamID == id) { - const SoundStreamConfig &cfg = m_CaptureStreams[id]; - volume = cfg.m_Volume; - return true; - } - return false; -} - - -void AlsaSoundDevice::checkMixerVolume(SoundStreamID id) -{ - if (id.isValid()) { - - if (m_hPlaybackMixer && m_PassivePlaybackStreams.contains(id) || m_PlaybackStreamID == id) { - snd_mixer_handle_events(m_hPlaybackMixer); - SoundStreamConfig &cfg = m_PlaybackStreams[id]; - - bool m = false; - float v = readPlaybackMixerVolume(cfg.m_Channel, m); - if (rint(100*cfg.m_Volume) != rint(100*v)) { - cfg.m_Volume = v; - notifyPlaybackVolumeChanged(id, v); - } - if (m != cfg.m_Muted) { - cfg.m_Muted = m; - notifyMuted(id, m); - } - } - - if (m_hCaptureMixer && m_CaptureStreamID == id) { - snd_mixer_handle_events(m_hCaptureMixer); - SoundStreamConfig &cfg = m_CaptureStreams[id]; - - if (m_CaptureChannels2ID.contains(cfg.m_Channel)) { - float v = readCaptureMixerVolume(cfg.m_Channel); - if (rint(100*cfg.m_Volume) != rint(100*v)) { - cfg.m_Volume = v; - notifyCaptureVolumeChanged(id, v); - } - } - } - } -} - - -float AlsaSoundDevice::readPlaybackMixerVolume(const TQString &channel, bool &muted) const -{ - if (!m_hPlaybackMixer) - return 0; // without error - - if (m_PlaybackChannels2ID.contains(channel) && m_hPlaybackMixer) { - AlsaMixerElement sid = m_PlaybackChannels2ID[channel]; - snd_mixer_elem_t *elem = snd_mixer_find_selem(m_hPlaybackMixer, sid); - if (elem) { - long min = 0; - long max = 0; - snd_mixer_selem_get_playback_volume_range(elem, &min, &max); - if (min != max) { - long val = min; - - muted = false; - int m = false; - if (snd_mixer_selem_get_playback_switch(elem, SND_MIXER_SCHN_FRONT_LEFT, &m) == 0) { - muted = !m; - } - if (snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, &val) == 0) { - return ((float)(val - min)) / (float)(max - min); - } - } - } - } - logError("AlsaSound::readPlaybackMixerVolume: " + - i18n("error while reading volume from hwplug:%1,%2") - .arg(m_PlaybackCard) - .arg(m_PlaybackDevice)); - return 0; -} - - -float AlsaSoundDevice::readCaptureMixerVolume(const TQString &channel) const -{ - if (!m_hCaptureMixer) - return 0; // without error - - if (m_CaptureChannels2ID.contains(channel) && m_hCaptureMixer) { - AlsaMixerElement sid = m_CaptureChannels2ID[channel]; - snd_mixer_elem_t *elem = snd_mixer_find_selem(m_hCaptureMixer, sid); - if (elem) { - if (!snd_mixer_selem_has_capture_volume(elem)) - return 0; - long min = 0; - long max = 0; - snd_mixer_selem_get_capture_volume_range(elem, &min, &max); - if (min != max) { - long val = min; - if (snd_mixer_selem_get_capture_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, &val) == 0) { - return ((float)(val - min)) / (float)(max - min); - } - } - } - } - logError("AlsaSound::readCaptureMixerVolume: " + - i18n("error while reading volume from hwplug:%1,%2") - .arg(m_CaptureCard) - .arg(m_CaptureDevice)); - return 0; -} - - -bool AlsaSoundDevice::writePlaybackMixerVolume (const TQString &channel, float &vol, bool muted) -{ - if (vol > 1.0) vol = 1.0; - if (vol < 0) vol = 0.0; - - if (!m_hPlaybackMixer) - return false; - - if (m_PlaybackChannels2ID.contains(channel) && m_hPlaybackMixer) { - AlsaMixerElement sid = m_PlaybackChannels2ID[channel]; - snd_mixer_elem_t *elem = snd_mixer_find_selem(m_hPlaybackMixer, sid); - if (elem) { - long min = 0; - long max = 0; - snd_mixer_selem_get_playback_volume_range(elem, &min, &max); - if (min != max) { - long val = (int)rint(min + (max - min) * vol); - vol = (float)(val - min) / (float)(max - min); - snd_mixer_selem_set_playback_switch_all(elem, !muted); - if (snd_mixer_selem_set_playback_volume_all(elem, val) == 0) { - return true; - } - } - } - } - logError("AlsaSound::writePlaybackMixerVolume: " + - i18n("error while writing volume %1 to hwplug:%2,%3") - .arg(vol) - .arg(m_PlaybackCard) - .arg(m_PlaybackDevice)); - return false; -} - - - - -bool AlsaSoundDevice::writeCaptureMixerVolume (const TQString &channel, float &vol) -{ - if (vol > 1.0) vol = 1.0; - if (vol < 0) vol = 0.0; - - if (!m_hCaptureMixer) - return false; - - if (m_CaptureChannels2ID.contains(channel) && m_hCaptureMixer) { - AlsaMixerElement sid = m_CaptureChannels2ID[channel]; - snd_mixer_elem_t *elem = snd_mixer_find_selem(m_hCaptureMixer, sid); - if (elem) { - long min = 0; - long max = 0; - snd_mixer_selem_get_capture_volume_range(elem, &min, &max); - if (min != max) { - long val = (int)rint(min + (max - min) * vol); - vol = (float)(val - min) / (float)(max - min); - if (snd_mixer_selem_set_capture_volume_all(elem, val) == 0) { - return true; - } - } - } - } - logError("AlsaSound::writeCaptureMixerVolume: " + - i18n("error while writing volume %1 to hwplug:%2,%3") - .arg(vol) - .arg(m_CaptureCard) - .arg(m_CaptureDevice)); - return false; -} - - -bool AlsaSoundDevice::writeCaptureMixerSwitch (const TQString &channel, bool capture) -{ - if (!m_hCaptureMixer) - return false; - - if (m_CaptureChannelsSwitch2ID.contains(channel) && m_hCaptureMixer) { - AlsaMixerElement sid = m_CaptureChannelsSwitch2ID[channel]; - snd_mixer_elem_t *elem = snd_mixer_find_selem(m_hCaptureMixer, sid); - if (elem) { - if (snd_mixer_selem_set_capture_switch_all(elem, capture) == 0) { - return true; - } - } - } - logError("AlsaSound::writeCaptureMixerSwitch: " + - i18n("error while setting capture switch %1 for hwplug:%2,%3") - .arg(channel) - .arg(m_CaptureCard) - .arg(m_CaptureDevice)); - return false; -} - - -void AlsaSoundDevice::selectCaptureChannel (const TQString &channel) -{ - writeCaptureMixerSwitch(channel, true); - - const TQString ADC = "ADC"; - if (m_CaptureChannels2ID.contains(ADC)) { - float v = readCaptureMixerVolume(ADC); - if (rint(v*100) == 0) { - float tmp_vol = 1.0; - writeCaptureMixerVolume(ADC, tmp_vol); - } - } - const TQString Digital = "Digital"; - if (m_CaptureChannels2ID.contains(Digital)) { - float v = readCaptureMixerVolume(Digital); - if (rint(v*100) == 0) { - float tmp_vol = 1.0; - writeCaptureMixerVolume(Digital, tmp_vol); - } - } - const TQString WAVE = "Wave"; - if (m_CaptureChannels2ID.contains(WAVE)) { - float x = 0; - writeCaptureMixerVolume(WAVE, x); - } - const TQString Capture = "Capture"; - if (m_CaptureChannelsSwitch2ID.contains(Capture)) { - writeCaptureMixerSwitch(Capture, true); - } - - for (TQMapConstIterator<TQString, AlsaConfigMixerSetting> it = m_CaptureMixerSettings.begin(); it != m_CaptureMixerSettings.end(); ++it) { - const AlsaConfigMixerSetting &s = *it; - if (s.m_card == m_CaptureCard && s.m_use) { - float vol = s.m_volume; - if (m_CaptureChannels2ID.contains(s.m_name)) - writeCaptureMixerVolume(s.m_name, vol); - if (m_CaptureChannelsSwitch2ID.contains(s.m_name)) - writeCaptureMixerSwitch(s.m_name, s.m_active); - } - } -} - - -void AlsaSoundDevice::setHWBufferSize(int s) -{ - m_HWBufferSize = s; -} - - -void AlsaSoundDevice::setBufferSize(int s) -{ - m_BufferSize = s; - m_PlaybackBuffer.resize(m_BufferSize); - m_CaptureBuffer.resize(m_BufferSize); -} - - -void AlsaSoundDevice::enablePlayback(bool on) -{ - m_EnablePlayback = on; -} - - -void AlsaSoundDevice::enableCapture(bool on) -{ - m_EnableCapture = on; -} - - -void AlsaSoundDevice::setPlaybackDevice(int card, int dev) -{ - if (m_PlaybackCard == card && m_PlaybackDevice == dev) - return; - - m_PlaybackCard = card; - m_PlaybackDevice = dev; - SoundFormat f = m_PlaybackFormat; - if (m_hPlayback) - openPlaybackDevice(f, /* reopen = */ true); - if (m_hPlaybackMixer) - openPlaybackMixerDevice(/* reopen = */ true); - - getPlaybackMixerChannels(m_PlaybackCard, - m_hPlaybackMixer, - m_PlaybackChannels, m_PlaybackChannels2ID); - notifyPlaybackChannelsChanged(m_SoundStreamClientID, m_PlaybackChannels); -} - - -void AlsaSoundDevice::setCaptureDevice(int card, int dev) -{ -// logDebug("AlsaSoundDevice::setCaptureDevice-1: m_CaptureCard == " + TQString::number(m_CaptureCard) + ", card == " + TQString::number(card)); - if (m_CaptureCard == card && m_CaptureDevice == dev) - return; -// logDebug("AlsaSoundDevice::setCaptureDevice-2: m_CaptureCard == " + TQString::number(m_CaptureCard) + ", card == " + TQString::number(card)); - - m_CaptureCard = card; - m_CaptureDevice = dev; - SoundFormat f = m_CaptureFormat; - if (m_hCapture) - openCaptureDevice(f, /* reopen = */ true); - if (m_hCaptureMixer) - openCaptureMixerDevice(/* reopen = */ true); - - getCaptureMixerChannels(m_CaptureCard, - m_hCaptureMixer, - m_CaptureChannels, m_CaptureChannels2ID, m_CaptureChannelsSwitch, m_CaptureChannelsSwitch2ID); - notifyCaptureChannelsChanged(m_SoundStreamClientID, m_CaptureChannels); -} - - -TQString AlsaSoundDevice::getSoundStreamClientDescription() const -{ - return i18n("ALSA Sound Device %1").arg(PluginBase::name()); -} - - -bool AlsaSoundDevice::mute (SoundStreamID id, bool mute) -{ - if (id.isValid() && (m_PlaybackStreamID == id || m_PassivePlaybackStreams.contains(id))) { - SoundStreamConfig &cfg = m_PlaybackStreams[id]; - if (mute != cfg.m_Muted) { - if (writePlaybackMixerVolume(cfg.m_Channel, cfg.m_Volume, cfg.m_Muted = mute)) { - notifyMuted(id, cfg.m_Muted); - } - } - return true; - } - return false; -} - -bool AlsaSoundDevice::unmute (SoundStreamID id, bool unmute) -{ - if (id.isValid() && (m_PlaybackStreamID == id || m_PassivePlaybackStreams.contains(id))) { - SoundStreamConfig &cfg = m_PlaybackStreams[id]; - bool mute = !unmute; - if (mute != cfg.m_Muted) { - if (writePlaybackMixerVolume(cfg.m_Channel, cfg.m_Volume, cfg.m_Muted = mute)) { - notifyMuted(id, cfg.m_Muted); - } - } - return true; - } - return false; -} - -bool AlsaSoundDevice::isMuted(SoundStreamID id, bool &m) const -{ - if (id.isValid() && (m_PlaybackStreamID == id || m_PassivePlaybackStreams.contains(id))) { - const SoundStreamConfig &cfg = m_PlaybackStreams[id]; - m = cfg.m_Muted; - return true; - } - return false; -} - - -void AlsaSoundDevice::setCaptureMixerSettings(const TQMap<TQString, AlsaConfigMixerSetting> &map) -{ - m_CaptureMixerSettings = map; -} - - - -// bool AlsaSoundDevice::event(TQEvent *_e) -// { -// bool retval = false; -// -// switch (_e->type()) { -// -// case CaptureTerminated : -// retval = true; -// break; -// -// case CaptureStep : -// -// slotPollCapture(); -// -// retval = true; -// break; -// -// case CaptureError : -// case CaptureWarning : -// case CaptureInfo : -// case CaptureDebug : -// if (m_captureThread) { -// AlsaCaptureEvent *e = static_cast<AlsaCaptureEvent*>(_e); -// TQString msg = i18n("ALSA Plugin, device plughw:%1,%2: %3") -// .arg(m_CaptureCard) -// .arg(m_CaptureDevice) -// .arg(e->message()); -// switch (_e->type()) { -// case CaptureError : -// logError(msg); -// m_captureThread->resetError(); -// break; -// case CaptureWarning : -// logWarning(msg); -// break; -// case CaptureInfo : -// logInfo(msg); -// break; -// case CaptureDebug : -// logDebug(msg); -// break; -// default: -// break; -// } -// } -// retval = true; -// break; -// -// default: -// retval = TQObject::event(_e); -// break; -// } -// -// return retval; -// } - - - - - - - - -#include "alsa-sound.moc" |