Skip to content
Snippets Groups Projects
Commit fa186c4d authored by Rafaël Carré's avatar Rafaël Carré
Browse files

* #6629 : simplify pulse callbacks

parent 84ec8623
No related branches found
No related tags found
No related merge requests found
...@@ -130,5 +130,7 @@ AudioStream::stream_state_callback (pa_stream* s, void* user_data) ...@@ -130,5 +130,7 @@ AudioStream::stream_state_callback (pa_stream* s, void* user_data)
bool AudioStream::isReady (void) bool AudioStream::isReady (void)
{ {
if (!_audiostream)
return false;
return pa_stream_get_state (_audiostream) == PA_STREAM_READY; return pa_stream_get_state (_audiostream) == PA_STREAM_READY;
} }
...@@ -42,21 +42,21 @@ void playback_callback (pa_stream* s, size_t bytes, void* userdata) ...@@ -42,21 +42,21 @@ void playback_callback (pa_stream* s, size_t bytes, void* userdata)
{ {
assert (s && bytes); assert (s && bytes);
assert (bytes > 0); assert (bytes > 0);
static_cast<PulseLayer*> (userdata)->processPlaybackData(); static_cast<PulseLayer*> (userdata)->writeToSpeaker();
} }
void capture_callback (pa_stream* s, size_t bytes, void* userdata) void capture_callback (pa_stream* s, size_t bytes, void* userdata)
{ {
assert (s && bytes); assert (s && bytes);
assert (bytes > 0); assert (bytes > 0);
static_cast<PulseLayer*> (userdata)->processCaptureData(); static_cast<PulseLayer*> (userdata)->readFromMic();
} }
void ringtone_callback (pa_stream* s, size_t bytes, void* userdata) void ringtone_callback (pa_stream* s, size_t bytes, void* userdata)
{ {
assert (s && bytes); assert (s && bytes);
assert (bytes > 0); assert (bytes > 0);
static_cast<PulseLayer*> (userdata)->processRingtoneData(); static_cast<PulseLayer*> (userdata)->ringtoneToSpeaker();
} }
void stream_moved_callback (pa_stream *s, void *userdata UNUSED) void stream_moved_callback (pa_stream *s, void *userdata UNUSED)
...@@ -405,72 +405,20 @@ PulseLayer::stopStream (void) ...@@ -405,72 +405,20 @@ PulseLayer::stopStream (void)
disconnectAudioStream(); disconnectAudioStream();
} }
void PulseLayer::processPlaybackData (void)
{
// Handle the data for the speakers
if (playback_ and playback_->pulseStream() and (pa_stream_get_state (playback_->pulseStream()) == PA_STREAM_READY)) {
// If the playback buffer is full, we don't overflow it; wait for it to have free space
if (pa_stream_writable_size (playback_->pulseStream()) == 0)
return;
writeToSpeaker();
}
}
void PulseLayer::processCaptureData (void)
{
// Handle the mic
// We check if the stream is ready
if (record_ and record_->pulseStream() and pa_stream_get_state (record_->pulseStream()) == PA_STREAM_READY)
readFromMic();
}
void PulseLayer::processRingtoneData (void)
{
// handle ringtone playback
if (ringtone_ and ringtone_->pulseStream() and (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 (pa_stream_writable_size (ringtone_->pulseStream()) == 0)
return;
ringtoneToSpeaker();
}
}
void PulseLayer::processData (void)
{
// Handle the data for the speakers
if (playback_ and playback_->pulseStream() and (pa_stream_get_state (playback_->pulseStream()) == PA_STREAM_READY)) {
// If the playback buffer is full, we don't overflow it; wait for it to have free space
if (pa_stream_writable_size (playback_->pulseStream()) == 0)
return;
writeToSpeaker();
}
// Handle the mic
// We check if the stream is ready
if (record_ and record_->pulseStream() and (pa_stream_get_state (record_->pulseStream()) == PA_STREAM_READY))
readFromMic();
}
void PulseLayer::writeToSpeaker (void) void PulseLayer::writeToSpeaker (void)
{ {
notifyincomingCall(); if (!playback_ or !playback_->isReady())
return;
// available bytes to be written in pulseaudio internal buffer // available bytes to be written in pulseaudio internal buffer
int writeableSizeBytes = pa_stream_writable_size (playback_->pulseStream()); int writeableSizeBytes = pa_stream_writable_size (playback_->pulseStream());
if (writeableSizeBytes < 0) { if (writeableSizeBytes < 0)
_error("Pulse: playback error : %s", pa_strerror (writeableSizeBytes)); _error("Pulse: playback error : %s", pa_strerror (writeableSizeBytes));
if (writeableSizeBytes <= 0)
return; return;
}
notifyincomingCall();
int urgentBytes = urgentRingBuffer_.AvailForGet(); int urgentBytes = urgentRingBuffer_.AvailForGet();
if (urgentBytes > writeableSizeBytes) if (urgentBytes > writeableSizeBytes)
...@@ -530,7 +478,6 @@ void PulseLayer::writeToSpeaker (void) ...@@ -530,7 +478,6 @@ void PulseLayer::writeToSpeaker (void)
SFLDataFormat *out = (SFLDataFormat*) pa_xmalloc (inBytes); SFLDataFormat *out = (SFLDataFormat*) pa_xmalloc (inBytes);
getMainBuffer()->getData (out, inBytes); getMainBuffer()->getData (out, inBytes);
// test if resampling is required
if (resample) { if (resample) {
SFLDataFormat* rsmpl_out = (SFLDataFormat*) pa_xmalloc (outBytes); SFLDataFormat* rsmpl_out = (SFLDataFormat*) pa_xmalloc (outBytes);
converter_->resample (out, rsmpl_out, mainBufferSampleRate, audioSampleRate_, inSamples); converter_->resample (out, rsmpl_out, mainBufferSampleRate, audioSampleRate_, inSamples);
...@@ -544,6 +491,9 @@ void PulseLayer::writeToSpeaker (void) ...@@ -544,6 +491,9 @@ void PulseLayer::writeToSpeaker (void)
void PulseLayer::readFromMic (void) void PulseLayer::readFromMic (void)
{ {
if (!record_ or !record_->isReady())
return;
const char *data = NULL; const char *data = NULL;
size_t r; size_t r;
SFLDataFormat *out; SFLDataFormat *out;
...@@ -581,12 +531,14 @@ end: ...@@ -581,12 +531,14 @@ end:
void PulseLayer::ringtoneToSpeaker (void) void PulseLayer::ringtoneToSpeaker (void)
{ {
int writableSize = pa_stream_writable_size (ringtone_->pulseStream()); if (!ringtone_ or !ringtone_->isReady())
return;
if (!ringtone_->isReady()) { int writableSize = pa_stream_writable_size (ringtone_->pulseStream());
_error("PulseAudio: Error: Ringtone stream not in state ready"); if (writableSize < 0)
_error("Pulse: ringtone error : %s", pa_strerror (writableSize));
if (writableSize <= 0)
return; return;
}
SFLDataFormat *out = (SFLDataFormat *) pa_xmalloc (writableSize); SFLDataFormat *out = (SFLDataFormat *) pa_xmalloc (writableSize);
......
...@@ -65,6 +65,14 @@ class PulseLayer : public AudioLayer ...@@ -65,6 +65,14 @@ class PulseLayer : public AudioLayer
return &sourceList_; return &sourceList_;
} }
/**
* Write data from the ring buffer to the harware and read data from the hardware
*/
void readFromMic (void);
void writeToSpeaker (void);
void ringtoneToSpeaker (void);
void updateSinkList (void); void updateSinkList (void);
void updateSourceList (void); void updateSourceList (void);
...@@ -79,67 +87,6 @@ class PulseLayer : public AudioLayer ...@@ -79,67 +87,6 @@ class PulseLayer : public AudioLayer
static void context_state_callback (pa_context* c, void* user_data); static void context_state_callback (pa_context* c, void* user_data);
void setPlaybackVolume (int volume);
void setCaptureVolume (int volume);
/**
* Accessor
* @return AudioStream* The pointer on the playback AudioStream object
*/
AudioStream* getPlaybackStream() const {
return playback_;
}
/**
* Accessor
* @return AudioStream* The pointer on the record AudioStream object
*/
AudioStream* getRecordStream() const {
return record_;
}
/**
* Accessor
* @return AudioStream* The pointer on the ringtone AudioStream object
*/
AudioStream* getRingtoneStream() const {
return ringtone_;
}
int getSpkrVolume (void) const {
return spkrVolume_;
}
void setSpkrVolume (int value) {
spkrVolume_ = value;
}
int getMicVolume (void) const {
return micVolume_;
}
void setMicVolume (int value) {
micVolume_ = value;
}
/**
* Handle used to write voice data to speaker
*/
void processPlaybackData (void);
/**
* Handle used to write voice data to microphone
*/
void processCaptureData (void);
/**
* Handle used to write audio data to speaker
*/
void processRingtoneData (void);
/**
* Process speaker and microphone audio data
*/
void processData (void);
private: private:
// Copy Constructor // Copy Constructor
PulseLayer (const PulseLayer& rh); PulseLayer (const PulseLayer& rh);
...@@ -147,13 +94,6 @@ class PulseLayer : public AudioLayer ...@@ -147,13 +94,6 @@ class PulseLayer : public AudioLayer
// Assignment Operator // Assignment Operator
PulseLayer& operator= (const PulseLayer& rh); PulseLayer& operator= (const PulseLayer& rh);
/**
* Write data from the ring buffer to the harware and read data from the hardware
*/
void readFromMic (void);
void writeToSpeaker (void);
void ringtoneToSpeaker (void);
/** /**
* Create the audio streams into the given context * Create the audio streams into the given context
* @param c The pulseaudio context * @param c The pulseaudio context
...@@ -184,9 +124,6 @@ class PulseLayer : public AudioLayer ...@@ -184,9 +124,6 @@ class PulseLayer : public AudioLayer
*/ */
AudioStream* ringtone_; AudioStream* ringtone_;
int spkrVolume_;
int micVolume_;
DeviceList sinkList_; DeviceList sinkList_;
DeviceList sourceList_; DeviceList sourceList_;
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
SamplerateConverter::SamplerateConverter (int freq) : _maxFreq(freq) SamplerateConverter::SamplerateConverter (int freq) : _maxFreq(freq)
{ {
printf("FREQ %d\n", freq);
int err; int err;
_src_state = src_new (SRC_LINEAR, 1, &err); _src_state = src_new (SRC_LINEAR, 1, &err);
......
...@@ -100,22 +100,4 @@ void AudioLayerTest::testPulseConnect() ...@@ -100,22 +100,4 @@ void AudioLayerTest::testPulseConnect()
_pulselayer = (PulseLayer*) Manager::instance().getAudioDriver(); _pulselayer = (PulseLayer*) Manager::instance().getAudioDriver();
CPPUNIT_ASSERT (_pulselayer->getLayerType() == PULSEAUDIO); CPPUNIT_ASSERT (_pulselayer->getLayerType() == PULSEAUDIO);
int sampleRate;
sampleRate = manager->audioPreference.getSmplrate();
CPPUNIT_ASSERT (_pulselayer->getPlaybackStream() == NULL);
CPPUNIT_ASSERT (_pulselayer->getRecordStream() == NULL);
sleep (1);
CPPUNIT_ASSERT (_pulselayer->getPlaybackStream() == NULL);
CPPUNIT_ASSERT (_pulselayer->getRecordStream() == NULL);
_pulselayer->startStream();
CPPUNIT_ASSERT (_pulselayer->getPlaybackStream()->pulseStream() != NULL);
CPPUNIT_ASSERT (_pulselayer->getRecordStream()->pulseStream() != NULL);
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment