Commit bc09f360 authored by Alexandre Savard's avatar Alexandre Savard

Merge branch 'm_savard' into echocancel

Conflicts:
	sflphone-common/src/audio/pulseaudio/audiostream.cpp
	sflphone-common/src/audio/pulseaudio/pulselayer.cpp
	sflphone-common/src/audio/pulseaudio/pulselayer.h
parents ec30a783 45ff2941
......@@ -1406,37 +1406,53 @@ dbus_set_audio_output_device(const int index)
}
/**
* Get all input devices index supported by current audio manager
* Set audio input device from its index
*/
gchar**
dbus_get_audio_input_device_list()
void
dbus_set_audio_input_device(const int index)
{
gchar** array;
GError* error = NULL;
org_sflphone_SFLphone_ConfigurationManager_get_audio_input_device_list(
configurationManagerProxy, &array, &error);
org_sflphone_SFLphone_ConfigurationManager_set_audio_input_device(
configurationManagerProxy, index, &error);
if (error)
{
ERROR("Failed to call get_audio_input_device_list() on ConfigurationManager: %s", error->message);
ERROR("Failed to call set_audio_input_device() on ConfigurationManager: %s", error->message);
g_error_free(error);
}
return array;
}
/**
* Set audio input device from its index
* Set adio ringtone device from its index
*/
void
dbus_set_audio_input_device(const int index)
dbus_set_audio_ringtone_device(const int index)
{
GError* error = NULL;
org_sflphone_SFLphone_ConfigurationManager_set_audio_input_device(
org_sflphone_SFLphone_ConfigurationManager_set_audio_ringtone_device(
configurationManagerProxy, index, &error);
if(error)
{
ERROR("Failed to call set_audio_ringtone_device() on ConfigurationManager: %s", error->message);
g_error_free(error);
}
}
/**
* Get all input devices index supported by current audio manager
*/
gchar**
dbus_get_audio_input_device_list()
{
gchar** array;
GError* error = NULL;
org_sflphone_SFLphone_ConfigurationManager_get_audio_input_device_list(
configurationManagerProxy, &array, &error);
if (error)
{
ERROR("Failed to call set_audio_input_device() on ConfigurationManager: %s", error->message);
ERROR("Failed to call get_audio_input_device_list() on ConfigurationManager: %s", error->message);
g_error_free(error);
}
return array;
}
/**
......
......@@ -97,7 +97,7 @@ AlsaLayer::closeLayer()
}
bool
AlsaLayer::openDevice (int indexIn, int indexOut, int sampleRate, int frameSize, int stream , std::string plugin)
AlsaLayer::openDevice (int indexIn, int indexOut, int indexRing, int sampleRate, int frameSize, int stream , std::string plugin)
{
/* Close the devices before open it */
if (stream == SFL_PCM_BOTH && is_capture_open() == true && is_playback_open() == true) {
......@@ -110,21 +110,16 @@ AlsaLayer::openDevice (int indexIn, int indexOut, int sampleRate, int frameSize,
_indexIn = indexIn;
_indexOut = indexOut;
_audioSampleRate = sampleRate;
_frameSize = frameSize;
_audioPlugin = std::string (plugin);
_debugAlsa (" Setting AlsaLayer: device in=%2d, out=%2d", _indexIn, _indexOut);
_debugAlsa (" : alsa plugin=%s", _audioPlugin.c_str());
_debugAlsa (" : nb channel in=%2d, out=%2d", _inChannel, _outChannel);
_debugAlsa (" : sample rate=%5d, format=%s", _audioSampleRate, SFLDataFormatString);
_audioThread = NULL;
......@@ -132,14 +127,12 @@ AlsaLayer::openDevice (int indexIn, int indexOut, int sampleRate, int frameSize,
ost::MutexLock lock (_mutex);
std::string pcmp = buildDeviceTopo (plugin, indexOut, 0);
std::string pcmc = buildDeviceTopo (plugin, indexIn, 0);
// use 1 sec buffer for resampling
_converter = new SamplerateConverter (_audioSampleRate, 1000);
// open_device (pcmp, pcmc, stream);
return true; // open_device (pcmp, pcmc, stream);
return true;
}
void
......@@ -159,8 +152,8 @@ AlsaLayer::startStream (void)
}
prepareCaptureStream ();
preparePlaybackStream ();
startCaptureStream ();
startPlaybackStream ();
......@@ -712,6 +705,8 @@ AlsaLayer::buildDeviceTopo (std::string plugin, int card, int subdevice)
pcm.append (ss1.str());
}
_debug("Audio: Device topo: %s", pcm.c_str());
return pcm;
}
......@@ -721,6 +716,8 @@ AlsaLayer::getSoundCardsInfo (int stream)
std::vector<std::string> cards_id;
HwIDPair p;
_debug("Audio: Get sound cards info: ");
snd_ctl_t* handle;
snd_ctl_card_info_t *info;
snd_pcm_info_t* pcminfo;
......@@ -746,10 +743,10 @@ AlsaLayer::getSoundCardsInfo (int stream)
if (snd_ctl_pcm_info (handle ,pcminfo) < 0) _debugAlsa (" Cannot get info");
else {
_debugAlsa ("card %i : %s [%s]",
_debugAlsa ("card %i : %s [%s] (%s)",
numCard,
snd_ctl_card_info_get_id (info),
snd_ctl_card_info_get_name (info));
snd_ctl_card_info_get_longname (info));
description = snd_ctl_card_info_get_name (info);
description.append (" - ");
description.append (snd_pcm_info_get_name (pcminfo));
......@@ -757,6 +754,7 @@ AlsaLayer::getSoundCardsInfo (int stream)
// The number of the sound card is associated with a string description
p = HwIDPair (numCard , description);
IDSoundCards.push_back (p);
}
}
......
......@@ -65,7 +65,7 @@ class AlsaLayer : public AudioLayer {
* SFL_PCM_BOTH
* @param plugin The alsa plugin ( dmix , default , front , surround , ...)
*/
bool openDevice(int indexIn, int indexOut, int sampleRate, int frameSize, int stream, std::string plugin);
bool openDevice(int indexIn, int indexOut, int indexRing, int sampleRate, int frameSize, int stream, std::string plugin);
/**
* Start the capture stream and prepare the playback stream.
......@@ -232,7 +232,7 @@ class AlsaLayer : public AudioLayer {
void* adjustVolume( void* buffer , int len, int stream );
/**
/**
* Handles to manipulate playback stream
* ALSA Library API
*/
......
......@@ -38,11 +38,9 @@
* @brief Main sound class. Manages the data transfers between the application and the hardware.
*/
class Recordable;
class ManagerImpl;
class AudioLayer {
private:
......@@ -95,7 +93,7 @@ class AudioLayer {
* SFL_PCM_BOTH
* @param plugin The alsa plugin ( dmix , default , front , surround , ...)
*/
virtual bool openDevice(int indexIn, int indexOut, int sampleRate, int frameSize, int stream , std::string plugin) = 0;
virtual bool openDevice(int indexIn, int indexOut, int indexRing, int sampleRate, int frameSize, int stream , std::string plugin) = 0;
/**
* Start the capture stream and prepare the playback stream.
......@@ -163,6 +161,13 @@ class AudioLayer {
*/
int getIndexOut() { return _indexOut; }
/**
* Get the index of the audio card for ringtone (could be differnet from playback)
* @return int The index of the card used for ringtone
* 0 for the first available card on the system, 1 ...
*/
int getIndexRing() {return _indexRing; }
/**
* Get the sample rate of the audio layer
* @return unsigned int The sample rate
......@@ -267,6 +272,11 @@ class AudioLayer {
*/
int _indexOut;
/**
* Number of audio cards on which ringtone stream has been opened
*/
int _indexRing;
/**
* Sample Rate SFLphone should send sound data to the sound card
* The value can be set in the user config file- now: 44100HZ
......
......@@ -384,7 +384,7 @@ void PulseLayer::context_state_callback (pa_context* c, void* user_data)
}
}
bool PulseLayer::openDevice (int indexIn UNUSED, int indexOut UNUSED, int sampleRate, int frameSize , int stream UNUSED, std::string plugin UNUSED)
bool PulseLayer::openDevice (int indexIn UNUSED, int indexOut UNUSED, int indexRing UNUSED, int sampleRate, int frameSize , int stream UNUSED, std::string plugin UNUSED)
{
_audioSampleRate = sampleRate;
_frameSize = frameSize;
......
......@@ -65,7 +65,7 @@ class PulseLayer : public AudioLayer {
* SFL_PCM_BOTH
* @param plugin The alsa plugin ( dmix , default , front , surround , ...)
*/
bool openDevice(int indexIn, int indexOut, int sampleRate, int frameSize , int stream, std::string plugin) ;
bool openDevice(int indexIn, int indexOut, int indexRing, int sampleRate, int frameSize , int stream, std::string plugin) ;
DeviceList* getSinkList(void) { return &_sinkList; }
......
......@@ -523,25 +523,35 @@
</arg>
</method>
<method name="getAudioInputDeviceList" tp:name-for-bindings="getAudioInputDeviceList">
<method name="setAudioInputDevice" tp:name-for-bindings="setAudioInputDevice">
<tp:docstring>
</tp:docstring>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
<arg type="as" name="list" direction="out">
<arg type="i" name="index" direction="in">
<tp:docstring>
</tp:docstring>
</arg>
</method>
<method name="setAudioInputDevice" tp:name-for-bindings="setAudioInputDevice">
<tp:docstring>
<method name="setAudioRingtoneDevice" tp:name-for-binding="setAudioRingtoneDevice">
<tp:docstring>
</tp:docstring>
<arg type="i" name="index" direction="in">
<tp:docstring>
</tp:docstring>
</arg>
</method>
<method name="getAudioInputDeviceList" tp:name-for-bindings="getAudioInputDeviceList">
<tp:docstring>
</tp:docstring>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
<arg type="as" name="list" direction="out">
<tp:docstring>
</tp:docstring>
</arg>
</method>
<method name="getCurrentAudioDevicesIndex" tp:name-for-bindings="getCurrentAudioDevicesIndex">
<tp:docstring>
</tp:docstring>
......
......@@ -544,16 +544,20 @@ std::vector<std::string> ConfigurationManager::getAudioOutputDeviceList() {
return Manager::instance().getAudioOutputDeviceList();
}
void ConfigurationManager::setAudioOutputDevice(const int32_t& index) {
return Manager::instance().setAudioOutputDevice(index);
}
std::vector<std::string> ConfigurationManager::getAudioInputDeviceList() {
return Manager::instance().getAudioInputDeviceList();
}
void ConfigurationManager::setAudioOutputDevice(const int32_t& index) {
return Manager::instance().setAudioDevice(index, SFL_PCM_PLAYBACK);
}
void ConfigurationManager::setAudioInputDevice(const int32_t& index) {
return Manager::instance().setAudioInputDevice(index);
return Manager::instance().setAudioDevice(index, SFL_PCM_CAPTURE);
}
void ConfigurationManager::setAudioRingtoneDevice(const int32_t& index) {
return Manager::instance().setAudioDevice(index, SFL_PCM_RINGTONE);
}
std::vector<std::string> ConfigurationManager::getCurrentAudioDevicesIndex() {
......
......@@ -70,8 +70,9 @@ public:
void setOutputAudioPlugin(const std::string& audioPlugin);
std::vector< std::string > getAudioOutputDeviceList();
void setAudioOutputDevice(const int32_t& index);
std::vector< std::string > getAudioInputDeviceList();
void setAudioInputDevice(const int32_t& index);
void setAudioRingtoneDevice(const int32_t& index);
std::vector< std::string > getAudioInputDeviceList();
std::vector< std::string > getCurrentAudioDevicesIndex();
int32_t getAudioDeviceIndex(const std::string& name);
std::string getCurrentAudioOutputPlugin( void );
......
......@@ -95,6 +95,7 @@ static const SOUND_FORMAT INT32 = 0x8;
#define SFL_PCM_BOTH 0x0021 /** To open both playback and capture devices */
#define SFL_PCM_PLAYBACK 0x0022 /** To open playback device only */
#define SFL_PCM_CAPTURE 0x0023 /** To open capture device only */
#define SFL_PCM_RINGTONE 0x0024
#ifdef USE_IAX
#define IAX2_ENABLED true /** IAX2 support */
......
......@@ -2316,8 +2316,8 @@ void ManagerImpl::setInputAudioPlugin (const std::string& audioPlugin) {
if (CHECK_INTERFACE (layer , ALSA)) {
_debug ("Set input audio plugin");
_audiodriver -> setErrorMessage(-1);
_audiodriver -> openDevice(_audiodriver -> getIndexIn(),
_audiodriver -> getIndexOut(), _audiodriver -> getSampleRate(),
_audiodriver -> openDevice(_audiodriver->getIndexIn(), _audiodriver->getIndexOut(),
_audiodriver->getIndexRing(), _audiodriver -> getSampleRate(),
_audiodriver -> getFrameSize(), SFL_PCM_CAPTURE, audioPlugin);
if (_audiodriver -> getErrorMessage() != -1)
......@@ -2336,9 +2336,9 @@ void ManagerImpl::setOutputAudioPlugin (const std::string& audioPlugin) {
_debug ("Manager: Set output audio plugin");
_audiodriver -> setErrorMessage(-1);
res = _audiodriver -> openDevice(_audiodriver -> getIndexIn(),
_audiodriver -> getIndexOut(), _audiodriver -> getSampleRate(),
_audiodriver -> getFrameSize(), SFL_PCM_BOTH, audioPlugin);
res = _audiodriver -> openDevice(_audiodriver->getIndexIn(), _audiodriver->getIndexOut(),
_audiodriver->getIndexRing(), _audiodriver -> getSampleRate(),
_audiodriver -> getFrameSize(), SFL_PCM_BOTH, audioPlugin);
if (_audiodriver -> getErrorMessage() != -1)
notifyErrClient(_audiodriver -> getErrorMessage());
......@@ -2367,27 +2367,50 @@ std::vector<std::string> ManagerImpl::getAudioOutputDeviceList (void) {
/**
* Set audio output device
*/
void ManagerImpl::setAudioOutputDevice (const int index) {
AlsaLayer *alsalayer;
std::string alsaplugin;
_debug ("Set audio output device: %i", index);
_audiodriver -> setErrorMessage(-1);
alsalayer = dynamic_cast<AlsaLayer*> (getAudioDriver());
alsaplugin = alsalayer->getAudioPlugin();
void ManagerImpl::setAudioDevice (const int index, int streamType) {
AlsaLayer *alsalayer = NULL;
std::string alsaplugin;
_debug ("Manager: Set audio device: %i", index);
_debug (" set output plugin: %s", alsaplugin.c_str());
_audiodriver -> setErrorMessage(-1);
_audiodriver->openDevice(_audiodriver->getIndexIn(), index,
_audiodriver->getSampleRate(), _audiodriver->getFrameSize(),
SFL_PCM_PLAYBACK, alsaplugin);
if(!(alsalayer = dynamic_cast<AlsaLayer*> (getAudioDriver()))) {
_warn("Manager: Error: No audio driver");
return;
}
alsaplugin = alsalayer->getAudioPlugin();
_debug ("Manager: Set ALSA plugin: %s", alsaplugin.c_str());
switch(streamType) {
case SFL_PCM_PLAYBACK:
_audiodriver->openDevice(_audiodriver->getIndexIn(), index, _audiodriver->getIndexRing(),
_audiodriver->getSampleRate(), _audiodriver->getFrameSize(),
SFL_PCM_PLAYBACK, alsaplugin);
setConfig(AUDIO, ALSA_CARD_ID_OUT, index);
break;
case SFL_PCM_CAPTURE:
_audiodriver->openDevice(index, _audiodriver->getIndexOut(), _audiodriver->getIndexRing(),
_audiodriver->getSampleRate(), _audiodriver->getFrameSize(),
SFL_PCM_CAPTURE, alsaplugin);
setConfig(AUDIO, ALSA_CARD_ID_IN, index);
break;
case SFL_PCM_RINGTONE:
_audiodriver->openDevice(_audiodriver->getIndexOut(), _audiodriver->getIndexOut(), index,
_audiodriver->getSampleRate(), _audiodriver->getFrameSize(),
SFL_PCM_RINGTONE, alsaplugin);
setConfig(AUDIO, ALSA_CARD_ID_RING, index);
break;
default:
_warn("Unknown stream type");
}
if (_audiodriver -> getErrorMessage() != -1)
notifyErrClient(_audiodriver -> getErrorMessage());
if (_audiodriver -> getErrorMessage() != -1)
notifyErrClient(_audiodriver -> getErrorMessage());
// set config
setConfig(AUDIO, ALSA_CARD_ID_OUT, index);
}
/**
......@@ -2405,33 +2428,6 @@ std::vector<std::string> ManagerImpl::getAudioInputDeviceList (void) {
return devices;
}
/**
* Set audio input device
*/
void ManagerImpl::setAudioInputDevice (const int index) {
AlsaLayer *alsalayer;
std::string alsaplugin;
_debug ("Set audio input device %i", index);
_audiodriver -> setErrorMessage(-1);
alsalayer = dynamic_cast<AlsaLayer*> (getAudioDriver());
alsaplugin = alsalayer->getAudioPlugin();
_debug (" set input plugin: %s", alsaplugin.c_str());
_audiodriver->openDevice(index, _audiodriver->getIndexOut(),
_audiodriver->getSampleRate(), _audiodriver->getFrameSize(),
SFL_PCM_CAPTURE, alsaplugin);
if (_audiodriver -> getErrorMessage() != -1)
notifyErrClient(_audiodriver -> getErrorMessage());
// set config
setConfig(AUDIO, ALSA_CARD_ID_IN, index);
}
/**
* Get string array representing integer indexes of output and input device
*/
......@@ -2750,7 +2746,7 @@ bool ManagerImpl::initAudioDriver (void) {
* Initialization: Main Thread and gui
*/
void ManagerImpl::selectAudioDriver (void) {
int layer, numCardIn, numCardOut, sampleRate, frameSize;
int layer, numCardIn, numCardOut, numCardRing, sampleRate, frameSize;
std::string alsaPlugin;
AlsaLayer *alsalayer;
......@@ -2761,6 +2757,8 @@ void ManagerImpl::selectAudioDriver (void) {
alsaPlugin = getConfigString(AUDIO, ALSA_PLUGIN);
numCardIn = getConfigInt(AUDIO, ALSA_CARD_ID_IN);
numCardOut = getConfigInt(AUDIO, ALSA_CARD_ID_OUT);
numCardRing = getConfigInt(AUDIO, ALSA_CARD_ID_RING);
sampleRate = getConfigInt(AUDIO, AUDIO_SAMPLE_RATE);
if (sampleRate <= 0 || sampleRate > 48000) {
......@@ -2772,25 +2770,29 @@ void ManagerImpl::selectAudioDriver (void) {
/* Only for the ALSA layer, we check the sound card information */
if (layer == ALSA) {
alsalayer = dynamic_cast<AlsaLayer*> (getAudioDriver());
alsalayer = dynamic_cast<AlsaLayer*> (getAudioDriver());
if (!alsalayer -> soundCardIndexExist(numCardIn, SFL_PCM_CAPTURE)) {
_debug (" Card with index %i doesn't exist or cannot capture. Switch to 0.", numCardIn);
numCardIn = ALSA_DFT_CARD_ID;
setConfig(AUDIO, ALSA_CARD_ID_IN, ALSA_DFT_CARD_ID);
}
if (!alsalayer -> soundCardIndexExist(numCardIn, SFL_PCM_CAPTURE)) {
_debug (" Card with index %i doesn't exist or cannot capture. Switch to 0.", numCardIn);
numCardIn = ALSA_DFT_CARD_ID;
setConfig(AUDIO, ALSA_CARD_ID_IN, ALSA_DFT_CARD_ID);
}
if (!alsalayer -> soundCardIndexExist(numCardOut, SFL_PCM_PLAYBACK)) {
_debug (" Card with index %i doesn't exist or cannot playback. Switch to 0.", numCardOut);
numCardOut = ALSA_DFT_CARD_ID;
setConfig(AUDIO, ALSA_CARD_ID_OUT, ALSA_DFT_CARD_ID);
}
if (!alsalayer -> soundCardIndexExist(numCardOut, SFL_PCM_PLAYBACK)) {
_debug (" Card with index %i doesn't exist or cannot playback . Switch to 0.", numCardOut);
numCardOut = ALSA_DFT_CARD_ID;
setConfig(AUDIO, ALSA_CARD_ID_OUT, ALSA_DFT_CARD_ID);
}
if (!alsalayer->soundCardIndexExist(numCardRing, SFL_PCM_RINGTONE)) {
_debug(" Card with index %i doesn't exist or cannot ringtone. Switch to 0.", numCardRing);
}
}
_audiodriver->setErrorMessage(-1);
/* Open the audio devices */
_audiodriver->openDevice(numCardIn, numCardOut, sampleRate, frameSize,
_audiodriver->openDevice(numCardIn, numCardOut, numCardRing, sampleRate, frameSize,
SFL_PCM_BOTH, alsaPlugin);
/* Notify the error if there is one */
......@@ -2800,10 +2802,10 @@ void ManagerImpl::selectAudioDriver (void) {
}
void ManagerImpl::switchAudioManager (void) {
int type, samplerate, framesize, numCardIn, numCardOut;
int type, samplerate, framesize, numCardIn, numCardOut, numCardRing;
std::string alsaPlugin;
_debug ("Switching audio manager ");
_debug ("Manager: Switching audio manager ");
if (!_audiodriver)
return;
......@@ -2811,18 +2813,17 @@ void ManagerImpl::switchAudioManager (void) {
type = _audiodriver->getLayerType();
samplerate = getConfigInt(AUDIO, AUDIO_SAMPLE_RATE);
framesize = getConfigInt(AUDIO, ALSA_FRAME_SIZE);
_debug ("samplerate: %i, framesize %i\n", samplerate, framesize);
_debug ("Mnager: samplerate: %i, framesize %i\n", samplerate, framesize);
alsaPlugin = getConfigString(AUDIO, ALSA_PLUGIN);
numCardIn = getConfigInt(AUDIO, ALSA_CARD_ID_IN);
numCardOut = getConfigInt(AUDIO, ALSA_CARD_ID_OUT);
numCardRing = getConfigInt(AUDIO, ALSA_CARD_ID_RING);
_debug ("Deleting current layer... ");
_debug ("Manager: Deleting current layer... ");
// ost::MutexLock lock (*getAudioLayerMutex());
getAudioLayerMutex()->enter();
......@@ -2835,33 +2836,33 @@ void ManagerImpl::switchAudioManager (void) {
switch (type) {
case ALSA:
_debug ("Creating Pulseaudio layer...");
_debug ("Manager: Creating Pulseaudio layer...");
_audiodriver = new PulseLayer(this);
_audiodriver->setMainBuffer(&_mainBuffer);
break;
case PULSEAUDIO:
_debug ("Creating ALSA layer...");
_debug ("Manager: Creating ALSA layer...");
_audiodriver = new AlsaLayer(this);
_audiodriver->setMainBuffer(&_mainBuffer);
break;
default:
_debug ("Error: audio layer unknown");
_warn("Manager: Error: audio layer unknown");
break;
}
_audiodriver->setErrorMessage(-1);
_audiodriver->openDevice(numCardIn, numCardOut, samplerate, framesize,
_audiodriver->openDevice(numCardIn, numCardOut, numCardRing, samplerate, framesize,
SFL_PCM_BOTH, alsaPlugin);
if (_audiodriver -> getErrorMessage() != -1)
notifyErrClient(_audiodriver -> getErrorMessage());
_debug ("Current device: %i ", type);
_debug ("Manager: Current device: %i ", type);
_debug ("has current call: %i ", hasCurrentCall());
_debug ("Manager: Has current call: %i ", hasCurrentCall());
if (hasCurrentCall())
_audiodriver->startStream();
......
......@@ -527,10 +527,11 @@ class ManagerImpl {
std::vector<std::string> getAudioOutputDeviceList(void);
/**
* Set audio output device
* Set audio device
* @param index The index of the soundcard
* @param the type of stream, either SFL_PCM_PLAYBACK, SFL_PCM_CAPTURE, SFL_PCM_RINGTONE
*/
void setAudioOutputDevice(const int index);
void setAudioDevice(const int index, const int streamType);
/**
* Get list of supported audio input device
......@@ -538,12 +539,6 @@ class ManagerImpl {
*/
std::vector<std::string> getAudioInputDeviceList(void);
/**
* Set audio input device
* @param index The index of the soundcard
*/
void setAudioInputDevice(const int index);
/**
* Get string array representing integer indexes of output and input device
* @return std::vector<std::string> A list of the current audio devices
......
......@@ -35,6 +35,7 @@
#define CODECS "ActiveCodecs" /** List of active codecs */
#define ALSA_CARD_ID_IN "Alsa.cardID_In" /** Soundcard index to use for capture */
#define ALSA_CARD_ID_OUT "Alsa.cardID_Out" /** Soundcard index to use for playback */
#define ALSA_CARD_ID_RING "Alsa.cardID_Ring" /** Soundcard index to use for ringtone */
#define ALSA_FRAME_SIZE "Alsa.framesize" /** Audio layer frame size */
#define ALSA_PLUGIN "Alsa.plugin" /** Alsa plugin */
#define AUDIO_SAMPLE_RATE "Alsa.sampleRate" /** Audio layer sample rate */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment