add interface to get audio format list

pull/296/head
mpromonet 2 years ago
parent a38262b88e
commit a80b4cf202

@ -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<int> 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<int> m_fmtList;
};

@ -9,7 +9,7 @@
#pragma once
#include <list>
// ---------------------------------
// 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<int> getVideoFormatList() { return std::list<int>(); }
virtual unsigned long getSampleRate() { return -1; }
virtual unsigned long getChannels() { return -1; }
virtual int getAudioFormat() { return -1; }
virtual std::list<int> getAudioFormatList() { return std::list<int>(); }
virtual ~DeviceInterface() {};
};

@ -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;
}

Loading…
Cancel
Save