aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/Output/directsound/outputdirectsound.cpp71
-rw-r--r--src/plugins/Output/directsound/outputdirectsound.h15
2 files changed, 82 insertions, 4 deletions
diff --git a/src/plugins/Output/directsound/outputdirectsound.cpp b/src/plugins/Output/directsound/outputdirectsound.cpp
index feaa2cf08..d26d6ac57 100644
--- a/src/plugins/Output/directsound/outputdirectsound.cpp
+++ b/src/plugins/Output/directsound/outputdirectsound.cpp
@@ -19,25 +19,31 @@
***************************************************************************/
#include <QObject>
+#include <QSettings>
#include <string.h>
#include <iostream>
#include <unistd.h>
#include <qmmp/buffer.h>
-#include <qmmp/visual.h>
+#include <math.h>
#include "outputdirectsound.h"
#define DS_BUFSIZE (48*1024)
+OutputDirectSound *OutputDirectSound::instance = 0;
+VolumeDirectSound *OutputDirectSound::volumeControl = 0;
+
OutputDirectSound::OutputDirectSound() : Output()
{
m_ds = 0;
m_primaryBuffer = 0;
m_dsBuffer = 0;
m_dsBufferAt = 0;
+ instance = this;
}
OutputDirectSound::~OutputDirectSound()
{
+ instance = 0;
uninitialize();
}
@@ -104,7 +110,7 @@ bool OutputDirectSound::initialize(quint32 freq, int chan, Qmmp::AudioFormat for
ZeroMemory(&bufferDesc, sizeof(DSBUFFERDESC));
bufferDesc.dwSize = sizeof(DSBUFFERDESC);
- bufferDesc.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN |
+ bufferDesc.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME |
DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLPOSITIONNOTIFY;
bufferDesc.lpwfxFormat = &wfex;
bufferDesc.dwBufferBytes = DS_BUFSIZE; // buffer size
@@ -128,6 +134,8 @@ bool OutputDirectSound::initialize(quint32 freq, int chan, Qmmp::AudioFormat for
m_dsBuffer->Play(0,0,DSBPLAY_LOOPING);
m_dsBufferAt = 0;
configure(freq, chan, Qmmp::PCM_S16LE);
+ if(volumeControl)
+ volumeControl->restore();
return true;
}
@@ -213,6 +221,11 @@ void OutputDirectSound::reset()
m_dsBuffer->SetCurrentPosition(m_dsBufferAt-128);
}
+IDirectSoundBuffer8 *OutputDirectSound::secondaryBuffer()
+{
+ return m_dsBuffer;
+}
+
void OutputDirectSound::uninitialize()
{
m_dsBufferAt = 0;
@@ -250,15 +263,65 @@ DWORD OutputDirectSound::bytesToWrite()
/***** MIXER *****/
VolumeDirectSound::VolumeDirectSound()
-{}
+{
+ OutputDirectSound::volumeControl = this;
+ QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
+ m_volume.left = settings.value("DirectSound/left_volume", 100).toInt();
+ m_volume.right = settings.value("DirectSound/right_volume", 100).toInt();
+}
VolumeDirectSound::~VolumeDirectSound()
-{}
+{
+ m_volume = volume();
+ QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
+ settings.setValue("DirectSound/left_volume", m_volume.left);
+ settings.setValue("DirectSound/right_volume", m_volume.right);
+ OutputDirectSound::volumeControl = 0;
+}
void VolumeDirectSound::setVolume(const VolumeSettings &vol)
{
+ if(OutputDirectSound::instance && OutputDirectSound::instance->secondaryBuffer())
+ {
+ int maxVol = qMax(vol.left, vol.right);
+ double voldB = -100.0, pandB = 0;
+ if(maxVol)
+ {
+ voldB = 20.0*log(maxVol/100.0)/log(10);
+ int balance = (vol.right - vol.left)*100.0/maxVol;
+ pandB = balance ? 20.0*log((100.0 - fabs(balance))/100.0)/log(10) : 0;
+ if(balance > 0)
+ pandB = -pandB;
+ }
+ OutputDirectSound::instance->secondaryBuffer()->SetVolume(voldB*100);
+ OutputDirectSound::instance->secondaryBuffer()->SetPan(pandB*100);
+ }
+ m_volume = vol;
}
VolumeSettings VolumeDirectSound::volume() const
{
+ VolumeSettings vol;
+ if(OutputDirectSound::instance && OutputDirectSound::instance->secondaryBuffer())
+ {
+ long v = 0;
+ double voldB = 0, pandB = 0;
+ OutputDirectSound::instance->secondaryBuffer()->GetVolume(&v);
+ voldB = v / 100.0;
+ OutputDirectSound::instance->secondaryBuffer()->GetPan(&v);
+ pandB = v / 100.0;
+ int volume = 100*pow(10, voldB/20.0);
+ int balance = 100 - 100*pow(10, abs(pandB)/20.0);
+ if(pandB > 0)
+ balance = -balance;
+ vol.left = volume-qMax(balance,0)*volume/100.0;
+ vol.right = volume+qMin(balance,0)*volume/100.0;
+ return vol;
+ }
+ return m_volume;
+}
+
+void VolumeDirectSound::restore()
+{
+ setVolume(m_volume);
}
diff --git a/src/plugins/Output/directsound/outputdirectsound.h b/src/plugins/Output/directsound/outputdirectsound.h
index c78d88fb4..bae67efbe 100644
--- a/src/plugins/Output/directsound/outputdirectsound.h
+++ b/src/plugins/Output/directsound/outputdirectsound.h
@@ -28,6 +28,8 @@
#include <qmmp/volume.h>
#include <qmmp/output.h>
+class VolumeDirectSound;
+
/**
@author Ilya Kotov <forkotov02@hotmail.ru>
*/
@@ -47,6 +49,12 @@ public:
void resume();
void reset();
+ //volume control
+ static OutputDirectSound *instance;
+ static VolumeDirectSound *volumeControl;
+ IDirectSoundBuffer8 *secondaryBuffer();
+
+
private:
// helper functions
void status();
@@ -59,6 +67,9 @@ private:
DWORD m_dsBufferAt;
};
+/**
+ @author Ilya Kotov <forkotov02@hotmail.ru>
+*/
class VolumeDirectSound : public Volume
{
public:
@@ -67,6 +78,10 @@ public:
void setVolume(const VolumeSettings &vol);
VolumeSettings volume() const;
+ void restore();
+
+private:
+ VolumeSettings m_volume;
};