Skip to content
Snippets Groups Projects
Commit 1adb48c2 authored by Alexandre Savard's avatar Alexandre Savard
Browse files

[#5342] Update audio stream initialization

parent 819f7661
No related branches found
No related tags found
No related merge requests found
...@@ -33,17 +33,15 @@ ...@@ -33,17 +33,15 @@
static pa_channel_map channel_map; static pa_channel_map channel_map;
AudioStream::AudioStream (pa_context *c, pa_threaded_mainloop *m, std::string desc, int type, int smplrate)
AudioStream::AudioStream (PulseLayerType * driver, int smplrate)
: _audiostream (NULL), : _audiostream (NULL),
_context (driver->context), _context (c),
_streamType (driver->type), _streamType (type),
_streamDescription (driver->description), _streamDescription (desc),
_volume(), _volume(),
_flag (PA_STREAM_AUTO_TIMING_UPDATE), _flag (PA_STREAM_AUTO_TIMING_UPDATE),
_sample_spec(), _sample_spec(),
_mainloop (driver->mainloop) _mainloop (m)
{ {
_sample_spec.format = PA_SAMPLE_S16LE; // PA_SAMPLE_FLOAT32LE; _sample_spec.format = PA_SAMPLE_S16LE; // PA_SAMPLE_FLOAT32LE;
_sample_spec.rate = smplrate; _sample_spec.rate = smplrate;
......
...@@ -44,30 +44,30 @@ ...@@ -44,30 +44,30 @@
* This data structure contains the different king of audio streams available * This data structure contains the different king of audio streams available
*/ */
enum STREAM_TYPE { enum STREAM_TYPE {
PLAYBACK_STREAM, PLAYBACK_STREAM, CAPTURE_STREAM, RINGTONE_STREAM, UPLOAD_STREAM
CAPTURE_STREAM,
RINGTONE_STREAM,
UPLOAD_STREAM
}; };
struct PulseLayerType { struct AudioStreamParams {
pa_context * context; pa_context * context;
pa_threaded_mainloop * mainloop; pa_threaded_mainloop * mainloop;
std::string description; std::string description;
int type; int type;
double volume; int smplrate;
}; };
class AudioStream class AudioStream {
{
public: public:
/** /**
* Constructor * Constructor
* @param context The PulseLayerType structure containing various information. *
* @param context pulseaudio's application context.
* @param mainloop pulseaudio's main loop
* @param description
* @param types
* @param audio sampling rate
*/ */
AudioStream (PulseLayerType * driver, int smplrate); AudioStream(pa_context *, pa_threaded_mainloop *, std::string, int, int);
/** /**
* Destructor * Destructor
...@@ -142,8 +142,6 @@ class AudioStream ...@@ -142,8 +142,6 @@ class AudioStream
*/ */
pa_stream_state_t getStreamState(void); pa_stream_state_t getStreamState(void);
private: private:
// Copy Constructor // Copy Constructor
...@@ -198,9 +196,21 @@ class AudioStream ...@@ -198,9 +196,21 @@ class AudioStream
* Streams parameters * Streams parameters
*/ */
pa_cvolume _volume; pa_cvolume _volume;
/**
* Some special flags for stream connections.
* ex: PA_STREAM_ADJUST_LATENCY, PA_STREAM_START_MUTED, PA_STREAM_VARIABLE_RATE
*/
pa_stream_flags_t _flag; pa_stream_flags_t _flag;
/**
* A sample format and attribute specification
*/
pa_sample_spec _sample_spec; pa_sample_spec _sample_spec;
/**
* A pointer to the opaque threaded main loop object
*/
pa_threaded_mainloop * _mainloop; pa_threaded_mainloop * _mainloop;
ost::Mutex _mutex; ost::Mutex _mutex;
......
...@@ -496,18 +496,11 @@ bool PulseLayer::createStreams (pa_context* c) ...@@ -496,18 +496,11 @@ bool PulseLayer::createStreams (pa_context* c)
std::string recordDevice = _manager->audioPreference.getDeviceRecord(); std::string recordDevice = _manager->audioPreference.getDeviceRecord();
std::string ringtoneDevice = _manager->audioPreference.getDeviceRingtone(); std::string ringtoneDevice = _manager->audioPreference.getDeviceRingtone();
_debug ("Audio: Device stored in config for playback: %s", playbackDevice.c_str()); _debug ("Audio: Device for playback: %s", playbackDevice.c_str());
_debug ("Audio: Device stored in config for record: %s", recordDevice.c_str()); _debug ("Audio: Device for record: %s", recordDevice.c_str());
_debug ("Audio: Device stored in config for ringtone: %s", ringtoneDevice.c_str()); _debug ("Audio: Device for ringtone: %s", ringtoneDevice.c_str());
PulseLayerType * playbackParam = new PulseLayerType(); playback = new AudioStream (c, m, PLAYBACK_STREAM_NAME, PLAYBACK_STREAM, _audioSampleRate);
playbackParam->context = c;
playbackParam->type = PLAYBACK_STREAM;
playbackParam->description = PLAYBACK_STREAM_NAME;
playbackParam->volume = _manager->getSpkrVolume();
playbackParam->mainloop = m;
playback = new AudioStream (playbackParam, _audioSampleRate);
if (inSinkList (playbackDevice)) { if (inSinkList (playbackDevice)) {
playback->connectStream (&playbackDevice); playback->connectStream (&playbackDevice);
...@@ -521,16 +514,8 @@ bool PulseLayer::createStreams (pa_context* c) ...@@ -521,16 +514,8 @@ bool PulseLayer::createStreams (pa_context* c)
// pa_stream_set_suspended_callback(playback->pulseStream(), stream_suspended_callback, this); // pa_stream_set_suspended_callback(playback->pulseStream(), stream_suspended_callback, this);
pa_stream_set_moved_callback (playback->pulseStream(), stream_moved_callback, this); pa_stream_set_moved_callback (playback->pulseStream(), stream_moved_callback, this);
pa_stream_set_latency_update_callback (playback->pulseStream(), latency_update_callback, this); pa_stream_set_latency_update_callback (playback->pulseStream(), latency_update_callback, this);
delete playbackParam;
PulseLayerType * recordParam = new PulseLayerType();
recordParam->context = c;
recordParam->type = CAPTURE_STREAM;
recordParam->description = CAPTURE_STREAM_NAME;
recordParam->volume = _manager->getMicVolume();
recordParam->mainloop = m;
record = new AudioStream (recordParam, _audioSampleRate); record = new AudioStream (c, m, CAPTURE_STREAM_NAME, CAPTURE_STREAM, _audioSampleRate);
if (inSourceList (recordDevice)) { if (inSourceList (recordDevice)) {
record->connectStream (&recordDevice); record->connectStream (&recordDevice);
...@@ -542,16 +527,8 @@ bool PulseLayer::createStreams (pa_context* c) ...@@ -542,16 +527,8 @@ bool PulseLayer::createStreams (pa_context* c)
// pa_stream_set_suspended_callback(record->pulseStream(), stream_suspended_callback, this); // pa_stream_set_suspended_callback(record->pulseStream(), stream_suspended_callback, this);
pa_stream_set_moved_callback (record->pulseStream(), stream_moved_callback, this); pa_stream_set_moved_callback (record->pulseStream(), stream_moved_callback, this);
pa_stream_set_latency_update_callback (record->pulseStream(), latency_update_callback, this); pa_stream_set_latency_update_callback (record->pulseStream(), latency_update_callback, this);
delete recordParam;
PulseLayerType * ringtoneParam = new PulseLayerType();
ringtoneParam->context = c;
ringtoneParam->type = RINGTONE_STREAM;
ringtoneParam->description = RINGTONE_STREAM_NAME;
ringtoneParam->volume = _manager->getSpkrVolume();
ringtoneParam->mainloop = m;
ringtone = new AudioStream (ringtoneParam, _audioSampleRate); ringtone = new AudioStream (c, m, RINGTONE_STREAM_NAME, RINGTONE_STREAM, _audioSampleRate*2);
if (inSourceList (ringtoneDevice)) { if (inSourceList (ringtoneDevice)) {
ringtone->connectStream (&ringtoneDevice); ringtone->connectStream (&ringtoneDevice);
...@@ -561,7 +538,6 @@ bool PulseLayer::createStreams (pa_context* c) ...@@ -561,7 +538,6 @@ bool PulseLayer::createStreams (pa_context* c)
pa_stream_set_write_callback (ringtone->pulseStream(), ringtone_callback, this); pa_stream_set_write_callback (ringtone->pulseStream(), ringtone_callback, this);
pa_stream_set_moved_callback (ringtone->pulseStream(), stream_moved_callback, this); pa_stream_set_moved_callback (ringtone->pulseStream(), stream_moved_callback, this);
delete ringtoneParam;
pa_threaded_mainloop_signal (m , 0); pa_threaded_mainloop_signal (m , 0);
...@@ -716,7 +692,7 @@ void PulseLayer::processCaptureData (void) ...@@ -716,7 +692,7 @@ void PulseLayer::processCaptureData (void)
void PulseLayer::processRingtoneData (void) void PulseLayer::processRingtoneData (void)
{ {
// handle ringtone playback // handle ringtone playback
if (ringtone && (ringtone)->pulseStream() && (pa_stream_get_state (ringtone->pulseStream()) == PA_STREAM_READY)) { if (ringtone && ringtone->pulseStream() && (pa_stream_get_state (ringtone->pulseStream()) == PA_STREAM_READY)) {
// If the playback buffer is full, we don't overflow it; wait for it to have free space // If the playback buffer is full, we don't overflow it; wait for it to have free space
if (pa_stream_writable_size (ringtone->pulseStream()) == 0) if (pa_stream_writable_size (ringtone->pulseStream()) == 0)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment