From 474f1dd86f6b7410f2d3278bcfaedc86a1af5fab Mon Sep 17 00:00:00 2001 From: badaix Date: Sat, 30 Apr 2016 10:17:10 +0200 Subject: [PATCH] player support for different sample formats --- client/player/alsaPlayer.cpp | 17 ++++++++-- client/player/openslPlayer.cpp | 58 ++++++++++++++++++++++++---------- client/stream.cpp | 2 +- 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/client/player/alsaPlayer.cpp b/client/player/alsaPlayer.cpp index 8326cc32..f71c91c7 100644 --- a/client/player/alsaPlayer.cpp +++ b/client/player/alsaPlayer.cpp @@ -19,6 +19,7 @@ #include "alsaPlayer.h" #include "common/log.h" #include "common/snapException.h" +#include "common/strCompat.h" //#define BUFFER_TIME 120000 #define PERIOD_TIME 30000 @@ -60,7 +61,19 @@ void AlsaPlayer::initAlsa() if ((pcm = snd_pcm_hw_params_set_access(handle_, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) throw SnapException("Can't set interleaved mode: " + string(snd_strerror(pcm))); - if ((pcm = snd_pcm_hw_params_set_format(handle_, params, SND_PCM_FORMAT_S16_LE)) < 0) + snd_pcm_format_t snd_pcm_format; + if (format.bits == 8) + snd_pcm_format = SND_PCM_FORMAT_S8; + else if (format.bits == 16) + snd_pcm_format = SND_PCM_FORMAT_S16_LE; + else if ((format.bits == 24) && (format.sampleSize == 4)) + snd_pcm_format = SND_PCM_FORMAT_S24_LE; + else if (format.bits == 32) + snd_pcm_format = SND_PCM_FORMAT_S32_LE; + else + throw SnapException("Unsupported sample format: " + cpt::to_string(format.bits)); + + if ((pcm = snd_pcm_hw_params_set_format(handle_, params, snd_pcm_format)) < 0) throw SnapException("Can't set format: " + string(snd_strerror(pcm))); if ((pcm = snd_pcm_hw_params_set_channels(handle_, params, channels)) < 0) @@ -100,7 +113,7 @@ void AlsaPlayer::initAlsa() snd_pcm_hw_params_get_period_size(params, &frames_, 0); logO << "frames: " << frames_ << "\n"; - buff_size = frames_ * channels * 2 /* 2 -> sample size */; + buff_size = frames_ * format.frameSize; //channels * 2 /* 2 -> sample size */; buff_ = (char *) malloc(buff_size); snd_pcm_hw_params_get_period_time(params, &tmp, NULL); diff --git a/client/player/openslPlayer.cpp b/client/player/openslPlayer.cpp index 21b093de..f3292db5 100644 --- a/client/player/openslPlayer.cpp +++ b/client/player/openslPlayer.cpp @@ -23,6 +23,7 @@ #include "openslPlayer.h" #include "common/log.h" #include "common/snapException.h" +#include "common/strCompat.h" using namespace std; @@ -209,57 +210,82 @@ void OpenslPlayer::initOpensl() result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE); throwUnsuccess("OutputMixObject::Realize", result); - SLuint32 sr = SL_SAMPLINGRATE_44_1; + SLuint32 samplesPerSec = SL_SAMPLINGRATE_48; switch(format.rate) { case 8000: - sr = SL_SAMPLINGRATE_8; + samplesPerSec = SL_SAMPLINGRATE_8; break; case 11025: - sr = SL_SAMPLINGRATE_11_025; + samplesPerSec = SL_SAMPLINGRATE_11_025; break; case 16000: - sr = SL_SAMPLINGRATE_16; + samplesPerSec = SL_SAMPLINGRATE_16; break; case 22050: - sr = SL_SAMPLINGRATE_22_05; + samplesPerSec = SL_SAMPLINGRATE_22_05; break; case 24000: - sr = SL_SAMPLINGRATE_24; + samplesPerSec = SL_SAMPLINGRATE_24; break; case 32000: - sr = SL_SAMPLINGRATE_32; + samplesPerSec = SL_SAMPLINGRATE_32; break; case 44100: - sr = SL_SAMPLINGRATE_44_1; + samplesPerSec = SL_SAMPLINGRATE_44_1; break; case 48000: - sr = SL_SAMPLINGRATE_48; + samplesPerSec = SL_SAMPLINGRATE_48; break; case 64000: - sr = SL_SAMPLINGRATE_64; + samplesPerSec = SL_SAMPLINGRATE_64; break; case 88200: - sr = SL_SAMPLINGRATE_88_2; + samplesPerSec = SL_SAMPLINGRATE_88_2; break; case 96000: - sr = SL_SAMPLINGRATE_96; + samplesPerSec = SL_SAMPLINGRATE_96; break; case 192000: - sr = SL_SAMPLINGRATE_192; + samplesPerSec = SL_SAMPLINGRATE_192; break; default: throw SnapException("Sample rate not supported"); } + SLuint32 bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; + SLuint32 containerSize = SL_PCMSAMPLEFORMAT_FIXED_16; + switch(format.bits) + { + case 8: + bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_8; + containerSize = SL_PCMSAMPLEFORMAT_FIXED_8; + break; + case 16: + bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; + containerSize = SL_PCMSAMPLEFORMAT_FIXED_16; + break; + case 24: + bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_24; + containerSize = SL_PCMSAMPLEFORMAT_FIXED_32; + break; + case 32: + bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_32; + containerSize = SL_PCMSAMPLEFORMAT_FIXED_32; + break; + default: + throw SnapException("Unsupported sample format: " + cpt::to_string(format.bits)); + } + + SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2}; SLDataFormat_PCM format_pcm = { SL_DATAFORMAT_PCM, format.channels, - sr, - SL_PCMSAMPLEFORMAT_FIXED_16, - SL_PCMSAMPLEFORMAT_FIXED_16, + samplesPerSec, + bitsPerSample, + containerSize, SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT, SL_BYTEORDER_LITTLEENDIAN }; diff --git a/client/stream.cpp b/client/stream.cpp index f40f4ba2..e27ab8b5 100644 --- a/client/stream.cpp +++ b/client/stream.cpp @@ -76,7 +76,7 @@ void Stream::addChunk(msg::PcmChunk* chunk) chunks_.push(shared_ptr(chunk)); std::unique_lock lck(cvMutex_); cv_.notify_one(); -// logD << "new chunk: " << chunk_->getDuration() << ", Chunks: " << chunks_.size() << "\n"; +// logD << "new chunk: " << chunk->duration().count() << ", Chunks: " << chunks_.size() << "\n"; }