diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2014-10-09 18:11:57 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2014-10-09 18:11:57 +0000 |
| commit | d3589d6e96d2600576b1fa67972f24517f73e434 (patch) | |
| tree | d35f3ceb67fe6310eff79e309342d6d7e8cc91da /src/plugins/Output | |
| parent | 08fa7175d41277793d246981aef860895c8e5208 (diff) | |
| download | qmmp-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.cpp | 35 | ||||
| -rw-r--r-- | src/plugins/Output/oss4/outputoss4.h | 1 |
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]; }; |
