aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Output
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2014-10-09 18:11:57 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2014-10-09 18:11:57 +0000
commitd3589d6e96d2600576b1fa67972f24517f73e434 (patch)
treed35f3ceb67fe6310eff79e309342d6d7e8cc91da /src/plugins/Output
parent08fa7175d41277793d246981aef860895c8e5208 (diff)
downloadqmmp-d3589d6e96d2600576b1fa67972f24517f73e434.tar.gz
qmmp-d3589d6e96d2600576b1fa67972f24517f73e434.tar.bz2
qmmp-d3589d6e96d2600576b1fa67972f24517f73e434.zip
oss4: added multichannel support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@4553 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Output')
-rw-r--r--src/plugins/Output/oss4/outputoss4.cpp35
-rw-r--r--src/plugins/Output/oss4/outputoss4.h1
2 files changed, 35 insertions, 1 deletions
diff --git a/src/plugins/Output/oss4/outputoss4.cpp b/src/plugins/Output/oss4/outputoss4.cpp
index bfb9d26e8..0f4986fee 100644
--- a/src/plugins/Output/oss4/outputoss4.cpp
+++ b/src/plugins/Output/oss4/outputoss4.cpp
@@ -46,6 +46,26 @@ extern "C"
OutputOSS4 *OutputOSS4::m_instance = 0;
VolumeOSS4 *OutputOSS4::m_vc = 0;
+Qmmp::ChannelPosition OutputOSS4::m_oss_pos[16] =
+{
+ Qmmp::CHAN_NULL, //0 = null
+ Qmmp::CHAN_FRONT_LEFT, //1 = left
+ Qmmp::CHAN_FRONT_RIGHT, //2 = right
+ Qmmp::CHAN_FRONT_CENTER, //3 = center
+ Qmmp::CHAN_LFE, //4 = lfe
+ Qmmp::CHAN_SIDE_LEFT, //5 = left surround
+ Qmmp::CHAN_SIDE_RIGHT, //6 = right surround
+ Qmmp::CHAN_REAR_LEFT, //7 = left rear
+ Qmmp::CHAN_REAR_LEFT, //8 = right rear
+ Qmmp::CHAN_NULL,
+ Qmmp::CHAN_NULL,
+ Qmmp::CHAN_NULL,
+ Qmmp::CHAN_NULL,
+ Qmmp::CHAN_NULL,
+ Qmmp::CHAN_NULL,
+ Qmmp::CHAN_NULL
+};
+
OutputOSS4::OutputOSS4() : Output()
{
@@ -133,9 +153,22 @@ bool OutputOSS4::initialize(quint32 freq, ChannelMap map, Qmmp::AudioFormat form
if(ioctl(m_audio_fd, SNDCTL_DSP_COOKEDMODE, &enabled) == -1)
qWarning("OutputOSS4: ioctl SNDCTL_DSP_COOKEDMODE: %s", strerror(errno));
+ quint64 layout = 0;
+ if (ioctl (m_audio_fd, SNDCTL_DSP_GET_CHNORDER, &layout) == -1)
+ {
+ qWarning("OutputOSS4: couldn't query channel layout, assuming default");
+ layout = CHNORDER_NORMAL;
+ }
+ ChannelMap oss_map;
+ for(int i = 0; i < chan; i++)
+ {
+ quint32 pos = ((layout >> (i * 4)) & 0x0f);
+ oss_map << m_oss_pos[pos];
+ }
+
ioctl(m_audio_fd, SNDCTL_DSP_RESET, 0);
- configure(freq, map, format);
+ configure(freq, oss_map, format);
if(m_vc)
m_vc->restore();
diff --git a/src/plugins/Output/oss4/outputoss4.h b/src/plugins/Output/oss4/outputoss4.h
index 9996b6f91..43a66af22 100644
--- a/src/plugins/Output/oss4/outputoss4.h
+++ b/src/plugins/Output/oss4/outputoss4.h
@@ -56,6 +56,7 @@ private:
QString m_audio_device;
int m_audio_fd;
static OutputOSS4 *m_instance;
+ static Qmmp::ChannelPosition m_oss_pos[16];
};