diff options
Diffstat (limited to 'pica-client')
| -rw-r--r-- | pica-client/audiodevice.cpp | 56 | ||||
| -rw-r--r-- | pica-client/audiodevice.h | 5 | ||||
| -rw-r--r-- | pica-client/dialogs/settingsdialog.cpp | 76 | ||||
| -rw-r--r-- | pica-client/dialogs/settingsdialog.h | 7 | ||||
| -rw-r--r-- | pica-client/mediadevice.h | 8 | ||||
| -rw-r--r-- | pica-client/videodevice.cpp | 5 | ||||
| -rw-r--r-- | pica-client/videodevice.h | 2 |
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(); |
