From a80b4cf2026dd4b739db7d20aa2123ca4c8e7c91 Mon Sep 17 00:00:00 2001 From: mpromonet Date: Sat, 19 Nov 2022 18:41:13 +0100 Subject: [PATCH] add interface to get audio format list --- inc/ALSACapture.h | 15 +++++++------ inc/DeviceInterface.h | 20 ++++++++++-------- src/ALSACapture.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 15 deletions(-) diff --git a/inc/ALSACapture.h b/inc/ALSACapture.h index 2169211..c2e2f97 100755 --- a/inc/ALSACapture.h +++ b/inc/ALSACapture.h @@ -46,13 +46,15 @@ class ALSACapture : public DeviceInterface int configureFormat(snd_pcm_hw_params_t *hw_params); public: - virtual size_t read(char* buffer, size_t bufferSize); - virtual int getFd(); - virtual unsigned long getBufferSize() { return m_bufferSize; } + virtual size_t read(char* buffer, size_t bufferSize); + virtual int getFd(); + virtual unsigned long getBufferSize() { return m_bufferSize; } - virtual unsigned long getSampleRate() { return m_params.m_sampleRate; } - virtual unsigned long getChannels () { return m_params.m_channels; } - virtual int getAudioFormat () { return m_fmt; } + virtual unsigned long getSampleRate() { return m_params.m_sampleRate; } + virtual unsigned long getChannels () { return m_params.m_channels; } + virtual int getAudioFormat () { return m_fmt; } + virtual std::list getAudioFormatList() { return m_fmtList; } + private: snd_pcm_t* m_pcm; @@ -60,6 +62,7 @@ class ALSACapture : public DeviceInterface unsigned long m_periodSize; ALSACaptureParameters m_params; snd_pcm_format_t m_fmt; + std::list m_fmtList; }; diff --git a/inc/DeviceInterface.h b/inc/DeviceInterface.h index 5139e43..7ffc876 100755 --- a/inc/DeviceInterface.h +++ b/inc/DeviceInterface.h @@ -9,7 +9,7 @@ #pragma once - +#include // --------------------------------- // Device Interface @@ -19,14 +19,16 @@ class DeviceInterface public: virtual size_t read(char* buffer, size_t bufferSize) = 0; virtual int getFd() = 0; - virtual unsigned long getBufferSize() = 0; - virtual int getWidth() { return -1; } - virtual int getHeight() { return -1; } - virtual int getVideoFormat() { return -1; } - virtual unsigned long getSampleRate() { return -1; } - virtual unsigned long getChannels() { return -1; } - virtual int getAudioFormat() { return -1; } - virtual ~DeviceInterface() {}; + virtual unsigned long getBufferSize() = 0; + virtual int getWidth() { return -1; } + virtual int getHeight() { return -1; } + virtual int getVideoFormat() { return -1; } + virtual std::list getVideoFormatList() { return std::list(); } + virtual unsigned long getSampleRate() { return -1; } + virtual unsigned long getChannels() { return -1; } + virtual int getAudioFormat() { return -1; } + virtual std::list getAudioFormatList() { return std::list(); } + virtual ~DeviceInterface() {}; }; diff --git a/src/ALSACapture.cpp b/src/ALSACapture.cpp index ed52e3c..3263e3c 100644 --- a/src/ALSACapture.cpp +++ b/src/ALSACapture.cpp @@ -15,6 +15,46 @@ #include "ALSACapture.h" +static const snd_pcm_format_t formats[] = { + SND_PCM_FORMAT_S8, + SND_PCM_FORMAT_U8, + SND_PCM_FORMAT_S16_LE, + SND_PCM_FORMAT_S16_BE, + SND_PCM_FORMAT_U16_LE, + SND_PCM_FORMAT_U16_BE, + SND_PCM_FORMAT_S24_LE, + SND_PCM_FORMAT_S24_BE, + SND_PCM_FORMAT_U24_LE, + SND_PCM_FORMAT_U24_BE, + SND_PCM_FORMAT_S32_LE, + SND_PCM_FORMAT_S32_BE, + SND_PCM_FORMAT_U32_LE, + SND_PCM_FORMAT_U32_BE, + SND_PCM_FORMAT_FLOAT_LE, + SND_PCM_FORMAT_FLOAT_BE, + SND_PCM_FORMAT_FLOAT64_LE, + SND_PCM_FORMAT_FLOAT64_BE, + SND_PCM_FORMAT_IEC958_SUBFRAME_LE, + SND_PCM_FORMAT_IEC958_SUBFRAME_BE, + SND_PCM_FORMAT_MU_LAW, + SND_PCM_FORMAT_A_LAW, + SND_PCM_FORMAT_IMA_ADPCM, + SND_PCM_FORMAT_MPEG, + SND_PCM_FORMAT_GSM, + SND_PCM_FORMAT_SPECIAL, + SND_PCM_FORMAT_S24_3LE, + SND_PCM_FORMAT_S24_3BE, + SND_PCM_FORMAT_U24_3LE, + SND_PCM_FORMAT_U24_3BE, + SND_PCM_FORMAT_S20_3LE, + SND_PCM_FORMAT_S20_3BE, + SND_PCM_FORMAT_U20_3LE, + SND_PCM_FORMAT_U20_3BE, + SND_PCM_FORMAT_S18_3LE, + SND_PCM_FORMAT_S18_3BE, + SND_PCM_FORMAT_U18_3LE, + SND_PCM_FORMAT_U18_3BE, +}; ALSACapture* ALSACapture::createNew(const ALSACaptureParameters & params) { @@ -101,6 +141,15 @@ ALSACapture::ALSACapture(const ALSACaptureParameters & params) : m_pcm(NULL), m_ this->close(); } + if (!err) { + // get supported format + for (int i = 0; i < sizeof(formats)/sizeof(formats[0]); ++i) { + if (!snd_pcm_hw_params_test_format(m_pcm, hw_params, formats[i])) { + m_fmtList.push_back(formats[i]); + } + } + } + LOG(NOTICE) << "ALSA device: \"" << m_params.m_devName << "\" buffer_size:" << m_bufferSize << " period_size:" << m_periodSize << " rate:" << m_params.m_sampleRate; }