summaryrefslogtreecommitdiffstats
path: root/pica-client
diff options
context:
space:
mode:
Diffstat (limited to 'pica-client')
-rw-r--r--pica-client/audiodevice.cpp56
-rw-r--r--pica-client/audiodevice.h5
-rw-r--r--pica-client/dialogs/settingsdialog.cpp76
-rw-r--r--pica-client/dialogs/settingsdialog.h7
-rw-r--r--pica-client/mediadevice.h8
-rw-r--r--pica-client/videodevice.cpp5
-rw-r--r--pica-client/videodevice.h2
7 files changed, 140 insertions, 19 deletions
diff --git a/pica-client/audiodevice.cpp b/pica-client/audiodevice.cpp
index 16bf0b1..d2995e3 100644
--- a/pica-client/audiodevice.cpp
+++ b/pica-client/audiodevice.cpp
@@ -1,5 +1,9 @@
#include "audiodevice.h"
+#ifdef Q_OS_LINUX
+#include <alsa/asoundlib.h>
+#endif
+
AudioDevice::AudioDevice()
{
@@ -10,7 +14,57 @@ AudioDevice::~AudioDevice()
}
-QList<MediaDeviceInfo> AudioDevice::Enumerate()
+void AudioDevice::Capture()
+{
+}
+
+void AudioDevice::Play()
+{
+}
+
+void AudioDevice::Close()
{
+}
+
+QList<MediaDeviceInfo> AudioDevice::Enumerate(enum MediaDeviceStreamDirection dir)
+{
+ QList<MediaDeviceInfo> result;
+ int index = 0;
+
+#ifdef Q_OS_LINUX
+ void **hints, **n;
+ char *name = NULL, *descr = NULL, *io = NULL;
+ const char *direction = (dir == PLAYBACK) ? "Output" : "Input";
+
+ if (snd_device_name_hint(-1, "pcm", &hints) < 0)
+ return result;
+ n = hints;
+ while(*n)
+ {
+ MediaDeviceInfo d;
+
+ name = snd_device_name_get_hint(*n, "NAME");
+ descr = snd_device_name_get_hint(*n, "DESC");
+ io = snd_device_name_get_hint(*n, "IOID");
+
+ if (io && strcmp(io, direction))
+ goto release_resources;
+
+ d.device = QLatin1String(name);
+ d.humanReadable = QLatin1String(descr);
+ d.index = index++;
+ if (strstr(name, "default") == name)
+ result.prepend(d);
+ else
+ result << d;
+ release_resources:
+ free(io);
+ free(descr);
+ free(name);
+ n++;
+ }
+ snd_device_name_free_hint(hints);
+#endif
+ return result;
}
diff --git a/pica-client/audiodevice.h b/pica-client/audiodevice.h
index 9c8cec5..472dd03 100644
--- a/pica-client/audiodevice.h
+++ b/pica-client/audiodevice.h
@@ -8,7 +8,10 @@ class AudioDevice : public MediaDevice
public:
AudioDevice();
~AudioDevice();
- virtual QList<MediaDeviceInfo> Enumerate();
+ virtual void Capture();
+ virtual void Play();
+ virtual void Close();
+ virtual QList<MediaDeviceInfo> Enumerate(enum MediaDeviceStreamDirection dir);
};
#endif // AUDIODEVICE_H
diff --git a/pica-client/dialogs/settingsdialog.cpp b/pica-client/dialogs/settingsdialog.cpp
index 9342160..86faba6 100644
--- a/pica-client/dialogs/settingsdialog.cpp
+++ b/pica-client/dialogs/settingsdialog.cpp
@@ -122,12 +122,19 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
// Audio Devices
QLabel *lbAudioCaptureDev = new QLabel(tr("Microphone Device 🎙️"));
QLabel *lbAudioPlaybackDev = new QLabel(tr("Playback device 🎧"));
+ QLabel *lbAudioRingDev = new QLabel(tr("Ring device 🔔☎️"));
audioCaptureDev = new QComboBox(this);
- audioCaptureDev->addItem(QString("default"));
+ audioCaptureDev->setMinimumHeight(audioCaptureDev->height() * 2);
+ fillAudioCaptureDevices();
audioPlaybackDev = new QComboBox(this);
- audioPlaybackDev->addItem(QString("default"));
+ audioPlaybackDev->setMinimumHeight(audioPlaybackDev->height() * 2);
+ fillAudioPlaybackDevices();
+
+ audioRingDev = new QComboBox(this);
+ audioRingDev->setMinimumHeight(audioRingDev->height() * 2);
+ fillAudioRingDevices();
btAudioTest = new QPushButton(tr("Test"), this);
@@ -135,6 +142,8 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
audiodevlayout->addWidget(audioCaptureDev);
audiodevlayout->addWidget(lbAudioPlaybackDev);
audiodevlayout->addWidget(audioPlaybackDev);
+ audiodevlayout->addWidget(lbAudioRingDev);
+ audiodevlayout->addWidget(audioRingDev);
audiodevlayout->addWidget(btAudioTest);
audiodevlayout->addStretch(1);
@@ -142,8 +151,6 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
//Video Devices
videoDev = new QComboBox(this);
- //videoDev->setSizeAdjustPolicy(QComboBox::AdjustToContents);
- //videoDev->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
videoDev->setMinimumHeight(videoDev->height() * 2);
fillVideoDevices();
videoDevRefresh = new QPushButton(tr("Refresh 🔄"), this);
@@ -182,19 +189,43 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
setWindowTitle(tr("Pica Pica Messenger Settings"));
}
-void SettingsDialog::fillVideoDevices()
+void SettingsDialog::fillDevicesComboBox(QComboBox *cb, MediaDevice *dev, enum MediaDeviceStreamDirection dir)
{
- videoDev->clear();
- QList<MediaDeviceInfo> vd = VideoDevice().Enumerate();
- for (int i = 0; i < vd.size(); i++)
+ cb->clear();
+ QList<MediaDeviceInfo> md = dev->Enumerate(dir);
+ for (int i = 0; i < md.size(); i++)
{
QString item = QString(QLatin1String("%2\n(%1)"))
- .arg(vd.at(i).device)
- .arg(vd.at(i).humanReadable);
- videoDev->addItem(item, vd.at(i).device);
+ .arg(md.at(i).device)
+ .arg(md.at(i).humanReadable);
+ cb->addItem(item, md.at(i).device);
}
}
+void SettingsDialog::fillVideoDevices()
+{
+ VideoDevice vd;
+ fillDevicesComboBox(videoDev, &vd, CAPTURE);
+}
+
+void SettingsDialog::fillAudioCaptureDevices()
+{
+ AudioDevice acd;
+ fillDevicesComboBox(audioCaptureDev, &acd, CAPTURE);
+}
+
+void SettingsDialog::fillAudioPlaybackDevices()
+{
+ AudioDevice apd;
+ fillDevicesComboBox(audioPlaybackDev, &apd, PLAYBACK);
+}
+
+void SettingsDialog::fillAudioRingDevices()
+{
+ AudioDevice ard;
+ fillDevicesComboBox(audioRingDev, &ard, PLAYBACK);
+}
+
void SettingsDialog::toggleIncomingConnections(bool checked)
{
addr->setEnabled(checked);
@@ -305,10 +336,25 @@ void SettingsDialog::loadSettings()
break;
}
- QString videoCapDev = st.loadValue("video.capture_device", QString()).toString();
- int videoDevItem = videoDev->findData(videoCapDev);
+ QString videoCapDevVal = st.loadValue("video.capture_device", QString()).toString();
+ int videoDevItem = videoDev->findData(videoCapDevVal);
if (videoDevItem >= 0)
videoDev->setCurrentIndex(videoDevItem);
+
+ QString audioCapDevVal = st.loadValue("audio.capture_device", "default").toString();
+ int audioCapDevItem = audioCaptureDev->findData(audioCapDevVal);
+ if (audioCapDevItem >= 0)
+ audioCaptureDev->setCurrentIndex(audioCapDevItem);
+
+ QString audioPlaybackDevVal = st.loadValue("audio.playback_device", "default").toString();
+ int audioPlaybackDevItem = audioPlaybackDev->findData(audioPlaybackDevVal);
+ if (audioPlaybackDevItem >= 0)
+ audioPlaybackDev->setCurrentIndex(audioPlaybackDevItem);
+
+ QString audioRingDevVal = st.loadValue("audio.ring_device", "default").toString();
+ int audioRingDevItem = audioRingDev->findData(audioRingDevVal);
+ if (audioRingDevItem >= 0)
+ audioRingDev->setCurrentIndex(audioRingDevItem);
}
void SettingsDialog::storeSettings()
@@ -347,6 +393,8 @@ void SettingsDialog::storeSettings()
st.storeValue("multiple_logins.state", QString::number(mlpstate));
- QString videoCapDev;
st.storeValue("video.capture_device", videoDev->itemData(videoDev->currentIndex()).toString());
+ st.storeValue("audio.capture_device", audioCaptureDev->itemData(audioCaptureDev->currentIndex()).toString());
+ st.storeValue("audio.playback_device", audioPlaybackDev->itemData(audioPlaybackDev->currentIndex()).toString());
+ st.storeValue("audio.ring_device", audioRingDev->itemData(audioRingDev->currentIndex()).toString());
}
diff --git a/pica-client/dialogs/settingsdialog.h b/pica-client/dialogs/settingsdialog.h
index 98f486a..cf767b2 100644
--- a/pica-client/dialogs/settingsdialog.h
+++ b/pica-client/dialogs/settingsdialog.h
@@ -24,6 +24,7 @@
#include <QRadioButton>
#include <QComboBox>
#include <QCheckBox>
+#include "../mediadevice.h"
class SettingsDialog : public QDialog
{
@@ -54,6 +55,7 @@ private:
QComboBox *audioCaptureDev;
QComboBox *audioPlaybackDev;
+ QComboBox *audioRingDev;
QComboBox *videoDev;
QPushButton *videoDevRefresh;
@@ -65,12 +67,17 @@ private:
void loadSettings();
void storeSettings();
+ void fillDevicesComboBox(QComboBox *cb, MediaDevice *dev, enum MediaDeviceStreamDirection dir);
+
private slots:
void OK();
void Cancel();
void toggleIncomingConnections(bool checked);
void toggleMultipleLogins(bool checked);
void fillVideoDevices();
+ void fillAudioCaptureDevices();
+ void fillAudioPlaybackDevices();
+ void fillAudioRingDevices();
};
diff --git a/pica-client/mediadevice.h b/pica-client/mediadevice.h
index 14fe291..3099f41 100644
--- a/pica-client/mediadevice.h
+++ b/pica-client/mediadevice.h
@@ -4,6 +4,12 @@
#include <QString>
#include <QList>
+enum MediaDeviceStreamDirection
+{
+ CAPTURE,
+ PLAYBACK
+};
+
struct MediaDeviceInfo
{
QString device;
@@ -16,7 +22,7 @@ class MediaDevice
public:
MediaDevice();
virtual ~MediaDevice();
- virtual QList<MediaDeviceInfo> Enumerate() = 0;
+ virtual QList<MediaDeviceInfo> Enumerate(enum MediaDeviceStreamDirection) = 0;
virtual void Capture() = 0;
virtual void Play() = 0;
virtual void Close() = 0;
diff --git a/pica-client/videodevice.cpp b/pica-client/videodevice.cpp
index 781c8a2..aabb245 100644
--- a/pica-client/videodevice.cpp
+++ b/pica-client/videodevice.cpp
@@ -32,10 +32,13 @@ void VideoDevice::Close()
{
}
-QList<MediaDeviceInfo> VideoDevice::Enumerate()
+QList<MediaDeviceInfo> VideoDevice::Enumerate(enum MediaDeviceStreamDirection dir)
{
QList<MediaDeviceInfo> result;
int index = 0;
+
+ if (dir == PLAYBACK)
+ return result;
#ifdef Q_OS_LINUX
for (int i = 0; i < 64; i++)
{
diff --git a/pica-client/videodevice.h b/pica-client/videodevice.h
index f880b4c..b7a344e 100644
--- a/pica-client/videodevice.h
+++ b/pica-client/videodevice.h
@@ -8,7 +8,7 @@ class VideoDevice : public MediaDevice
public:
VideoDevice();
~VideoDevice();
- virtual QList<MediaDeviceInfo> Enumerate();
+ virtual QList<MediaDeviceInfo> Enumerate(enum MediaDeviceStreamDirection dir);
void Capture();
void Play();
void Close();