49
55
assert (s && bytes);
50
56
assert (bytes > 0);
51
57
static_cast<PulseLayer*> (userdata)->processCaptureData();
56
static void stream_suspended_callback (pa_stream *s UNUSED, void *userdata UNUSED)
58
_debug("Audio: Stream Suspended");
63
static void stream_moved_callback(pa_stream *s UNUSED, void *userdata UNUSED)
65
_debug("Audio: Stream Moved");
69
static void playback_underflow_callback (pa_stream* s, void* userdata UNUSED)
71
// _debug ("Audio: Buffer Underflow");
72
// pa_stream_trigger (s, NULL, NULL);
61
static void ringtone_callback (pa_stream* s, size_t bytes, void* userdata)
66
static_cast<PulseLayer*> (userdata)->processRingtoneData();
70
static void stream_moved_callback (pa_stream *s, void *userdata UNUSED)
73
_debug ("stream_moved_callback: stream %d to %d", pa_stream_get_index (s), pa_stream_get_device_index (s));
76
static void latency_update_callback (pa_stream *p, void *userdata UNUSED)
81
pa_stream_get_latency (p, &r_usec, NULL);
84
_debug ("Audio: Stream letency update %0.0f ms for device %s", (float) r_usec/1000, pa_stream_get_device_name (p));
85
_debug ("Audio: maxlength %u", pa_stream_get_buffer_attr (p)->maxlength);
86
_debug ("Audio: tlength %u", pa_stream_get_buffer_attr (p)->tlength);
87
_debug ("Audio: prebuf %u", pa_stream_get_buffer_attr (p)->prebuf);
88
_debug ("Audio: minreq %u", pa_stream_get_buffer_attr (p)->minreq);
89
_debug ("Audio: fragsize %u", pa_stream_get_buffer_attr (p)->fragsize);
93
static void sink_input_info_callback (pa_context *c UNUSED, const pa_sink_info *i, int eol, void *userdata)
95
char s[PA_SAMPLE_SPEC_SNPRINT_MAX], cv[PA_CVOLUME_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX];
103
" Sample Specification: %s\n"
105
" Owner Module: %u\n"
107
" Monitor Source: %u\n"
108
" Latency: %0.0f usec\n"
114
pa_sample_spec_snprint (s, sizeof (s), &i->sample_spec),
115
pa_channel_map_snprint (cm, sizeof (cm), &i->channel_map),
117
i->mute ? "muted" : pa_cvolume_snprint (cv, sizeof (cv), &i->volume),
120
i->flags & PA_SINK_HW_VOLUME_CTRL ? "HW_VOLUME_CTRL " : "",
121
i->flags & PA_SINK_LATENCY ? "LATENCY " : "",
122
i->flags & PA_SINK_HARDWARE ? "HARDWARE" : "");
124
std::string deviceName (i->name);
125
( (PulseLayer *) userdata)->getSinkList()->push_back (deviceName);
130
static void source_input_info_callback (pa_context *c UNUSED, const pa_source_info *i, int eol, void *userdata)
132
char s[PA_SAMPLE_SPEC_SNPRINT_MAX], cv[PA_CVOLUME_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX];
140
" Sample Specification: %s\n"
142
" Owner Module: %u\n"
144
" Monitor if Sink: %u\n"
145
" Latency: %0.0f usec\n"
151
pa_sample_spec_snprint (s, sizeof (s), &i->sample_spec),
152
pa_channel_map_snprint (cm, sizeof (cm), &i->channel_map),
154
i->mute ? "muted" : pa_cvolume_snprint (cv, sizeof (cv), &i->volume),
157
i->flags & PA_SOURCE_HW_VOLUME_CTRL ? "HW_VOLUME_CTRL " : "",
158
i->flags & PA_SOURCE_LATENCY ? "LATENCY " : "",
159
i->flags & PA_SOURCE_HARDWARE ? "HARDWARE" : "");
161
std::string deviceName (i->name);
162
( (PulseLayer *) userdata)->getSourceList()->push_back (deviceName);
168
static void context_changed_callback (pa_context* c, pa_subscription_event_type_t t, uint32_t idx UNUSED, void* userdata)
173
case PA_SUBSCRIPTION_EVENT_SINK:
174
_debug ("Audio: PA_SUBSCRIPTION_EVENT_SINK");
175
( (PulseLayer *) userdata)->getSinkList()->clear();
176
pa_context_get_sink_info_list (c, sink_input_info_callback, userdata);
178
case PA_SUBSCRIPTION_EVENT_SOURCE:
179
_debug ("Audio: PA_SUBSCRIPTION_EVENT_SOURCE");
180
( (PulseLayer *) userdata)->getSourceList()->clear();
181
pa_context_get_source_info_list (c, source_input_info_callback, userdata);
183
case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
184
_debug ("Audio: PA_SUBSCRIPTION_EVENT_SINK_INPUT");
186
case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT:
187
_debug ("Audio: PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT");
189
case PA_SUBSCRIPTION_EVENT_MODULE:
190
_debug ("Audio: PA_SUBSCRIPTION_EVENT_MODULE");
192
case PA_SUBSCRIPTION_EVENT_CLIENT:
193
_debug ("Audio: PA_SUBSCRIPTION_EVENT_CLIENT");
195
case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE:
196
_debug ("Audio: PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE");
198
case PA_SUBSCRIPTION_EVENT_SERVER:
199
_debug ("Audio: PA_SUBSCRIPTION_EVENT_SERVER");
201
case PA_SUBSCRIPTION_EVENT_CARD:
202
_debug ("Audio: PA_SUBSCRIPTION_EVENT_CARD");
204
case PA_SUBSCRIPTION_EVENT_FACILITY_MASK:
205
_debug ("Audio: PA_SUBSCRIPTION_EVENT_FACILITY_MASK");
207
case PA_SUBSCRIPTION_EVENT_CHANGE:
208
_debug ("Audio: PA_SUBSCRIPTION_EVENT_CHANGE");
210
case PA_SUBSCRIPTION_EVENT_REMOVE:
211
_debug ("Audio: PA_SUBSCRIPTION_EVENT_REMOVE");
212
( (PulseLayer *) userdata)->getSinkList()->clear();
213
( (PulseLayer *) userdata)->getSourceList()->clear();
214
pa_context_get_sink_info_list (c, sink_input_info_callback, userdata);
215
pa_context_get_source_info_list (c, source_input_info_callback, userdata);
217
case PA_SUBSCRIPTION_EVENT_TYPE_MASK:
218
_debug ("Audio: PA_SUBSCRIPTION_EVENT_TYPE_MASK");
221
_debug ("Audio: Unknown event type");
226
static void playback_underflow_callback (pa_stream* s UNUSED, void* userdata UNUSED)
76
231
static void playback_overflow_callback (pa_stream* s UNUSED, void* userdata UNUSED)
78
// _debug ("Audio: Buffer OverFlow");
83
236
PulseLayer::PulseLayer (ManagerImpl* manager)
84
: AudioLayer (manager , PULSEAUDIO)
237
: AudioLayer (manager , PULSEAUDIO)
90
244
_urgentRingBuffer.createReadPointer();
91
dcblocker = new DcBlocker();
92
246
is_started = false;
248
AudioLayer::_noisesuppressstate = true;
253
// captureFile = new ofstream ("probeCaptureFile", ofstream::binary);
254
// spkrFile = new ofstream ("probeSpkrFile", ofstream::binary);
104
266
_converter = NULL;
269
delete AudioLayer::_dcblocker;
270
AudioLayer::_dcblocker = NULL;
272
delete AudioLayer::_audiofilter;
273
AudioLayer::_audiofilter = NULL;
276
// captureFile->close();
277
// spkrFile->close();
279
// delete captureFile;
113
284
PulseLayer::openLayer (void)
117
_info("Audio: Open layer");
121
_info("Audio: Creating PulseAudio mainloop");
122
if (!(m = pa_threaded_mainloop_new()))
123
_warn ("Audio: Error: while creating pulseaudio mainloop");
125
if (pa_threaded_mainloop_start (m) < 0) {
126
_warn("Audio: Error: Failed to start pulseaudio mainloop");
134
_info("Audio: Creating new PulseAudio Context");
135
pa_threaded_mainloop_lock (m);
137
// Instanciate a context
138
if (! (context = pa_context_new (pa_threaded_mainloop_get_api (m) , "SFLphone")))
139
_warn ("Audio: Error: while creating pulseaudio context");
141
pa_threaded_mainloop_unlock (m);
147
connectPulseAudioServer();
288
_info ("Audio: Open Pulseaudio layer");
290
connectPulseAudioServer();
155
299
PulseLayer::closeLayer (void)
157
_info("Audio: Destroy pulselayer");
301
_info ("Audio: Close Pulseaudio layer");
159
303
disconnectAudioStream();
162
306
pa_threaded_mainloop_stop (m);
181
325
PulseLayer::connectPulseAudioServer (void)
183
_info("Audio: connect to pulseaudio server");
327
_info ("Audio: Connect to Pulseaudio server");
185
329
setenv ("PULSE_PROP_media.role", "phone", 1);
187
331
pa_context_flags_t flag = PA_CONTEXT_NOAUTOSPAWN ;
189
pa_threaded_mainloop_lock (m);
191
_info("Audio: Connect the context to the server");
192
pa_context_connect (context, NULL , flag , NULL);
335
// Instantiate a mainloop
336
_info ("Audio: Creating PulseAudio mainloop");
338
if (! (m = pa_threaded_mainloop_new()))
339
_warn ("Audio: Error: while creating pulseaudio mainloop");
346
// Instantiate a context
347
if (! (context = pa_context_new (pa_threaded_mainloop_get_api (m) , "SFLphone")))
348
_warn ("Audio: Error: while creating pulseaudio context");
353
// set context state callback before starting the mainloop
194
354
pa_context_set_state_callback (context, context_state_callback, this);
195
pa_threaded_mainloop_wait(m);
356
_info ("Audio: Connect the context to the server");
358
if (pa_context_connect (context, NULL , flag , NULL) < 0) {
359
_warn ("Audio: Error: Could not connect context to the server");
362
// Lock the loop before starting it
363
pa_threaded_mainloop_lock (m);
365
if (pa_threaded_mainloop_start (m) < 0)
366
_warn ("Audio: Error: Failed to start pulseaudio mainloop");
368
pa_threaded_mainloop_wait (m);
198
371
// Run the main loop
199
372
if (pa_context_get_state (context) != PA_CONTEXT_READY) {
200
_warn("Audio: Error: connecting to pulse audio server");
373
_warn ("Audio: Error: connecting to pulse audio server");
203
376
pa_threaded_mainloop_unlock (m);
205
_info("Audio: Context creation done");
378
_info ("Audio: Context creation done");
209
382
void PulseLayer::context_state_callback (pa_context* c, void* user_data)
211
_info("Audio: The state of the context changed");
384
_info ("Audio: The state of the context changed");
212
385
PulseLayer* pulse = (PulseLayer*) user_data;
213
386
assert (c && pulse->m);
251
430
// use 1 sec buffer for resampling
252
431
_converter = new SamplerateConverter (_audioSampleRate, 1000);
433
// Instantiate the algorithm
434
AudioLayer::_dcblocker = new DcBlocker();
435
AudioLayer::_audiofilter = new AudioProcessing (static_cast<Algorithm *> (_dcblocker));
441
void PulseLayer::updateSinkList (void)
444
_debug ("Audio: Update sink list");
446
getSinkList()->clear();
448
pa_context_get_sink_info_list (context, sink_input_info_callback, this);
451
void PulseLayer::updateSourceList (void)
453
_debug ("Audio: Update source list");
455
getSourceList()->clear();
457
pa_context_get_source_info_list (context, source_input_info_callback, this);
461
bool PulseLayer::inSinkList (std::string deviceName)
463
// _debug("Audio: in device list %s", deviceName.c_str());
465
DeviceList::iterator iter = _sinkList.begin();
467
// _debug("_deviceList.size() %d", _sinkList.size());
469
while (iter != _sinkList.end()) {
470
if (*iter == deviceName) {
471
// _debug("device name in list: %s", (*iter).c_str());
482
bool PulseLayer::inSourceList (std::string deviceName)
485
DeviceList::iterator iter = _sourceList.begin();
487
while (iter != _sourceList.end()) {
489
if (*iter == deviceName) {
258
500
bool PulseLayer::createStreams (pa_context* c)
260
_info("Audio: Create streams");
502
_info ("Audio: Create streams");
504
// _debug("Device list size %d", getDevicelist()->size());
506
std::string playbackDevice = _manager->audioPreference.getDevicePlayback();
507
std::string recordDevice = _manager->audioPreference.getDeviceRecord();
508
std::string ringtoneDevice = _manager->audioPreference.getDeviceRingtone();
510
_debug ("Audio: Device stored in config for playback: %s", playbackDevice.c_str());
511
_debug ("Audio: Device stored in config for record: %s", recordDevice.c_str());
512
_debug ("Audio: Device stored in config for ringtone: %s", ringtoneDevice.c_str());
262
514
PulseLayerType * playbackParam = new PulseLayerType();
263
515
playbackParam->context = c;
267
519
playbackParam->mainloop = m;
269
521
playback = new AudioStream (playbackParam, _audioSampleRate);
270
playback->connectStream();
523
if (inSinkList (playbackDevice)) {
524
playback->connectStream (&playbackDevice);
526
playback->connectStream (NULL);
271
529
pa_stream_set_write_callback (playback->pulseStream(), playback_callback, this);
272
530
pa_stream_set_overflow_callback (playback->pulseStream(), playback_overflow_callback, this);
273
531
pa_stream_set_underflow_callback (playback->pulseStream(), playback_underflow_callback, this);
274
532
// pa_stream_set_suspended_callback(playback->pulseStream(), stream_suspended_callback, this);
275
// pa_stream_set_moved_callback(playback->pulseStream(), stream_moved_callback, this);
533
pa_stream_set_moved_callback (playback->pulseStream(), stream_moved_callback, this);
534
pa_stream_set_latency_update_callback (playback->pulseStream(), latency_update_callback, this);
276
535
delete playbackParam;
278
537
PulseLayerType * recordParam = new PulseLayerType();
283
542
recordParam->mainloop = m;
285
544
record = new AudioStream (recordParam, _audioSampleRate);
286
record->connectStream();
546
if (inSourceList (recordDevice)) {
547
record->connectStream (&recordDevice);
549
record->connectStream (NULL);
287
552
pa_stream_set_read_callback (record->pulseStream() , capture_callback, this);
288
553
// pa_stream_set_suspended_callback(record->pulseStream(), stream_suspended_callback, this);
289
// pa_stream_set_moved_callback(record->pulseStream(), stream_moved_callback, this);
554
pa_stream_set_moved_callback (record->pulseStream(), stream_moved_callback, this);
555
pa_stream_set_latency_update_callback (record->pulseStream(), latency_update_callback, this);
290
556
delete recordParam;
558
PulseLayerType * ringtoneParam = new PulseLayerType();
559
ringtoneParam->context = c;
560
ringtoneParam->type = RINGTONE_STREAM;
561
ringtoneParam->description = RINGTONE_STREAM_NAME;
562
ringtoneParam->volume = _manager->getSpkrVolume();
563
ringtoneParam->mainloop = m;
565
ringtone = new AudioStream (ringtoneParam, _audioSampleRate);
567
if (inSourceList (ringtoneDevice)) {
568
ringtone->connectStream (&ringtoneDevice);
570
ringtone->connectStream (NULL);
573
pa_stream_set_write_callback (ringtone->pulseStream(), ringtone_callback, this);
574
pa_stream_set_moved_callback (ringtone->pulseStream(), stream_moved_callback, this);
575
delete ringtoneParam;
292
577
pa_threaded_mainloop_signal (m , 0);
470
786
AudioLoop* tone = _manager->getTelephoneTone();
471
AudioLoop* file_tone = _manager->getTelephoneFile();
788
// We must test if data have been received from network in case of early media
789
normalAvailBytes = getMainBuffer()->availForGet();
473
791
// flush remaining samples in _urgentRingBuffer
794
if ( (tone != 0) && (normalAvailBytes <= 0)) {
478
796
if (playback->getStreamState() == PA_STREAM_READY) {
480
798
out = (SFLDataFormat*) pa_xmalloc (writeableSize);
799
memset (out, 0, writeableSize);
481
801
int copied = tone->getNext (out, writeableSize / sizeof (SFLDataFormat), 100);
483
pa_stream_write (playback->pulseStream(), out, copied * sizeof (SFLDataFormat), NULL, 0, PA_SEEK_RELATIVE);
490
else if (file_tone != 0) {
492
if (playback->getStreamState() == PA_STREAM_READY) {
494
out = (SFLDataFormat*) pa_xmalloc (writeableSize);
495
int copied = file_tone->getNext (out, writeableSize / sizeof (SFLDataFormat), 100);
803
//spkrFile->write ( (const char *) out, copied*sizeof (SFLDataFormat));
497
804
pa_stream_write (playback->pulseStream(), out, copied * sizeof (SFLDataFormat), NULL, 0, PA_SEEK_RELATIVE);
549
854
int nbSample = _converter->upsampleData ( (SFLDataFormat*) out, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, nb_sample_down);
551
856
if ( (nbSample*sizeof (SFLDataFormat)) > (unsigned int) writeableSize)
552
_warn("Audio: Error: nbsbyte exceed buffer length");
857
_warn ("Audio: Error: nbsbyte exceed buffer length");
859
// spkrFile->write ( (const char *) out, nbSample*sizeof (SFLDataFormat));
554
860
pa_stream_write (playback->pulseStream(), rsmpl_out, nbSample*sizeof (SFLDataFormat), NULL, 0, PA_SEEK_RELATIVE);
556
862
pa_xfree (rsmpl_out);
865
// spkrFile->write ( (const char *) out, byteToGet);
560
866
pa_stream_write (playback->pulseStream(), out, byteToGet, NULL, 0, PA_SEEK_RELATIVE);
568
if ( (tone == 0) && (file_tone == 0)) {
570
877
SFLDataFormat* zeros = (SFLDataFormat*) pa_xmalloc (writeableSize);
572
878
bzero (zeros, writeableSize);
880
// spkrFile->write ( (const char *) zeros, writeableSize);
574
881
pa_stream_write (playback->pulseStream(), zeros, writeableSize, NULL, 0, PA_SEEK_RELATIVE);
576
883
pa_xfree (zeros);
608
914
if (_mainBufferSampleRate && ( (int) _audioSampleRate != _mainBufferSampleRate)) {
610
916
SFLDataFormat* rsmpl_out = (SFLDataFormat*) pa_xmalloc (readableSize);
917
memset (rsmpl_out, 0, readableSize);
612
919
int nbSample = r / sizeof (SFLDataFormat);
614
921
int nb_sample_up = nbSample;
923
nbSample = _converter->downsampleData ( (SFLDataFormat *) data, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, nb_sample_up);
617
nbSample = _converter->downsampleData ( (SFLDataFormat*) data, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, nb_sample_up);
925
// captureRsmplFile->write ((const char *)rsmpl_out, nbSample*sizeof(SFLDataFormat));
619
927
// remove dc offset
620
dcblocker->filter_signal (rsmpl_out, nbSample);
622
getMainBuffer()->putData ( (void*) rsmpl_out, nbSample*sizeof (SFLDataFormat), 100);
928
_audiofilter->processAudio (rsmpl_out, nbSample*sizeof (SFLDataFormat));
930
// captureFilterFile->write ((const char *)rsmpl_out, nbSample*sizeof(SFLDataFormat));
932
getMainBuffer()->putData (rsmpl_out, nbSample*sizeof (SFLDataFormat), 100);
624
934
pa_xfree (rsmpl_out);
628
// no resampling required
629
getMainBuffer()->putData ( (void*) data, r, 100);
939
SFLDataFormat* filter_out = (SFLDataFormat*) pa_xmalloc (r);
940
memset (filter_out, 0, r);
943
_audiofilter->processAudio ( (SFLDataFormat *) data, filter_out, r);
945
// captureFile->write ( (const char *) filter_out, r);
947
getMainBuffer()->putData (filter_out, r, 100);
949
pa_xfree (filter_out);
636
956
if (pa_stream_drop (record->pulseStream()) < 0) {
637
_warn("Audio: Error: capture stream drop failed: %s" , pa_strerror( pa_context_errno( context) ));
957
_warn ("Audio: Error: capture stream drop failed: %s" , pa_strerror (pa_context_errno (context)));
963
void PulseLayer::ringtoneToSpeaker (void)
965
AudioLoop* file_tone = _manager->getTelephoneFile();
969
int writableSize = pa_stream_writable_size (ringtone->pulseStream());
973
if (ringtone->getStreamState() == PA_STREAM_READY) {
975
out = (SFLDataFormat *) pa_xmalloc (writableSize);
976
memset (out, 0, writableSize);
978
int copied = file_tone->getNext (out, writableSize/sizeof (SFLDataFormat), 100);
979
pa_stream_write (ringtone->pulseStream(), out, copied*sizeof (SFLDataFormat), NULL, 0, PA_SEEK_RELATIVE);
985
if (ringtone->getStreamState() == PA_STREAM_READY) {
987
out = (SFLDataFormat*) pa_xmalloc (writableSize);
988
memset (out, 0, writableSize);
990
pa_stream_write (ringtone->pulseStream(), out, writableSize, NULL, 0, PA_SEEK_RELATIVE);