[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid.spec
^
|
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-11.1.66.tar.bz2/src/common/droid-util.c
^
|
@@ -1473,6 +1473,9 @@
return pa_streq(am->output->name, PA_DROID_PRIMARY_DEVICE);
} else {
pa_assert(am->input);
+ /* merged input mapping is always primary */
+ if (am->input && am->input2)
+ return true;
return pa_streq(am->input->name, PA_DROID_PRIMARY_DEVICE);
}
}
@@ -1491,6 +1494,33 @@
return NULL;
}
+pa_droid_mapping *pa_droid_idxset_mapping_with_device(pa_idxset *i, uint32_t device) {
+ pa_droid_mapping *am;
+ uint32_t idx;
+
+ pa_assert(i);
+
+#if AUDIO_API_VERSION_MAJ >= 2
+ device &= ~AUDIO_DEVICE_BIT_IN;
+#endif
+
+ PA_IDXSET_FOREACH(am, i, idx) {
+ if (am->direction == PA_DIRECTION_OUTPUT) {
+ pa_assert(am->output);
+ if (am->output->devices & device)
+ return am;
+ } else {
+ uint32_t all_devices;
+ pa_assert(am->input);
+ all_devices = am->input->devices | (am->input2 ? am->input2->devices : 0);
+ if (all_devices & device)
+ return am;
+ }
+ }
+
+ return NULL;
+}
+
bool pa_droid_output_port_name(audio_devices_t value, const char **to_str) {
return string_convert_num_to_str(string_conversion_table_output_device_fancy, (uint32_t) value, to_str);
}
@@ -2264,7 +2294,7 @@
return NULL;
}
-static int input_stream_open(pa_droid_stream *s) {
+static int input_stream_open(pa_droid_stream *s, bool resume_from_suspend) {
pa_droid_input_stream *input;
audio_stream_in_t *stream;
audio_source_t audio_source = AUDIO_SOURCE_DEFAULT;
@@ -2308,7 +2338,8 @@
pa_droid_hw_module_unlock(s->module);
if (ret < 0 || !stream) {
- pa_log("Failed to open input stream: %d with device: %u flags: %u sample rate: %u channels: %u (%u) format: %u (%u)",
+ pa_logl(resume_from_suspend ? PA_LOG_DEBUG : PA_LOG_ERROR,
+ "Failed to open input stream: %d with device: %u flags: %u sample rate: %u channels: %u (%u) format: %u (%u)",
ret,
input->device,
0, /* AUDIO_INPUT_FLAG_NONE on v3. v1 and v2 don't have input flags. */
@@ -2395,7 +2426,7 @@
/* We need to open the stream for a while so that we can know
* what sample rate we get. We need the rate for droid source. */
- if ((ret = input_stream_open(s)) < 0)
+ if ((ret = input_stream_open(s, false)) < 0)
goto fail;
if ((input->sample_spec.rate = input->stream->common.get_sample_rate(&input->stream->common)) != spec->rate)
@@ -2699,7 +2730,7 @@
return s->input->stream->common.standby(&s->input->stream->common);
}
} else if (s->input->merged || pa_droid_quirk(s->module, QUIRK_CLOSE_INPUT))
- return input_stream_open(s);
+ return input_stream_open(s, true);
}
return 0;
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-11.1.66.tar.bz2/src/common/droid-util.h
^
|
@@ -364,6 +364,7 @@
/* Go through idxset containing pa_droid_mapping objects and if primary output or input
* mapping is found, return pointer to that mapping. */
pa_droid_mapping *pa_droid_idxset_get_primary(pa_idxset *i);
+pa_droid_mapping *pa_droid_idxset_mapping_with_device(pa_idxset *i, uint32_t flag);
void pa_droid_mapping_free(pa_droid_mapping *am);
/* Add ports from sinks/sources.
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-11.1.66.tar.bz2/src/droid/droid-sink.c
^
|
@@ -251,8 +251,8 @@
* is multiples of buffer_size. Even if we don't write whole buffer size
* here it's okay, as long as mute time isn't configured too strictly. */
- p = pa_memblock_acquire(u->silence.memblock);
- wrote = pa_droid_stream_write(u->stream, (const uint8_t *) p + u->silence.index, u->silence.length);
+ p = pa_memblock_acquire_chunk(&u->silence);
+ wrote = pa_droid_stream_write(u->stream, p, u->silence.length);
pa_memblock_release(u->silence.memblock);
u->write_time = pa_rtclock_now() - u->write_time;
@@ -276,8 +276,8 @@
u->write_time = pa_rtclock_now();
for (;;) {
- p = pa_memblock_acquire(c.memblock);
- wrote = pa_droid_stream_write(u->stream, (const uint8_t *) p + c.index, c.length);
+ p = pa_memblock_acquire_chunk(&c);
+ wrote = pa_droid_stream_write(u->stream, p, c.length);
pa_memblock_release(c.memblock);
if (wrote < 0) {
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-11.1.66.tar.bz2/src/droid/droid-source.c
^
|
@@ -79,6 +79,7 @@
pa_droid_card_data *card_data;
pa_droid_hw_module *hw_module;
pa_droid_stream *stream;
+ bool stream_valid;
};
enum {
@@ -91,6 +92,8 @@
#define DROID_AUDIO_SOURCE_UNDEFINED "undefined"
static void userdata_free(struct userdata *u);
+static int suspend(struct userdata *u);
+static void unsuspend(struct userdata *u);
static int do_routing(struct userdata *u, audio_devices_t devices) {
int ret;
@@ -144,8 +147,22 @@
ssize_t readd;
pa_memchunk chunk;
+ chunk.index = 0;
chunk.memblock = pa_memblock_new(u->core->mempool, (size_t) u->buffer_size);
+ if (!u->stream_valid) {
+ /* try to resume or post silence */
+ unsuspend(u);
+ if (!u->stream_valid) {
+ p = pa_memblock_acquire(chunk.memblock);
+ chunk.length = pa_memblock_get_length(chunk.memblock);
+ memset(p, 0, chunk.length);
+ pa_source_post(u->source, &chunk);
+ pa_memblock_release(chunk.memblock);
+ goto end;
+ }
+ }
+
p = pa_memblock_acquire(chunk.memblock);
readd = pa_droid_stream_read(u->stream, p, pa_memblock_get_length(chunk.memblock));
pa_memblock_release(chunk.memblock);
@@ -157,7 +174,6 @@
u->timestamp += pa_bytes_to_usec(readd, &u->source->sample_spec);
- chunk.index = 0;
chunk.length = readd;
if (u->resampler) {
@@ -250,8 +266,11 @@
pa_assert(u);
pa_assert(u->stream);
- pa_droid_stream_suspend(u->stream, false);
- pa_log_info("Resuming...");
+ if (pa_droid_stream_suspend(u->stream, false) >= 0) {
+ u->stream_valid = true;
+ pa_log_info("Resuming...");
+ } else
+ u->stream_valid = false;
}
/* Called from IO context */
@@ -264,9 +283,9 @@
pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
- pa_droid_stream_suspend(u->stream, true);
+ suspend(u);
do_routing(u, device);
- pa_droid_stream_suspend(u->stream, false);
+ unsuspend(u);
break;
}
@@ -564,6 +583,7 @@
}
u = pa_xnew0(struct userdata, 1);
+ u->stream_valid = true;
u->core = m->core;
u->module = m;
u->card = card;
|
[-]
[+]
|
Changed |
_service:tar_git:pulseaudio-modules-droid-11.1.66.tar.bz2/src/droid/module-droid-card.c
^
|
@@ -428,8 +428,8 @@
}
static bool voicecall_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling) {
- pa_card_profile *cp;
- pa_droid_mapping *am_output, *am_input;
+ pa_card_profile *cp = NULL;
+ pa_droid_mapping *am_output;
pa_assert(u);
pa_assert(p);
@@ -440,27 +440,22 @@
return false;
}
- if (!(am_input = pa_droid_idxset_get_primary(u->old_profile->input_mappings)))
- pa_log_warn("Active profile doesn't have primary input device.");
+ if (pa_droid_idxset_mapping_with_device(u->old_profile->input_mappings,
+ AUDIO_DEVICE_IN_VOICE_CALL))
+ cp = pa_hashmap_get(u->card->profiles, VOICE_RECORD_PROFILE_NAME);
/* call mode specialities */
if (enabling) {
pa_droid_sink_set_voice_control(am_output->sink, true);
- if (am_input && am_input->input->devices & AUDIO_DEVICE_IN_VOICE_CALL &&
- (cp = pa_hashmap_get(u->card->profiles, VOICE_RECORD_PROFILE_NAME))) {
- if (cp->available == PA_AVAILABLE_NO) {
- pa_log_debug("Enable %s profile.", VOICE_RECORD_PROFILE_NAME);
- pa_card_profile_set_available(cp, PA_AVAILABLE_YES);
- }
+ if (cp && cp->available == PA_AVAILABLE_NO) {
+ pa_log_debug("Enable " VOICE_RECORD_PROFILE_NAME " profile.");
+ pa_card_profile_set_available(cp, PA_AVAILABLE_YES);
}
} else {
pa_droid_sink_set_voice_control(am_output->sink, false);
- if (am_input && am_input->input->devices & AUDIO_DEVICE_IN_VOICE_CALL &&
- (cp = pa_hashmap_get(u->card->profiles, VOICE_RECORD_PROFILE_NAME))) {
- if (cp->available == PA_AVAILABLE_YES) {
- pa_log_debug("Disable %s profile.", VOICE_RECORD_PROFILE_NAME);
- pa_card_profile_set_available(cp, PA_AVAILABLE_NO);
- }
+ if (cp && cp->available == PA_AVAILABLE_YES) {
+ pa_log_debug("Disable " VOICE_RECORD_PROFILE_NAME " profile.");
+ pa_card_profile_set_available(cp, PA_AVAILABLE_NO);
}
}
@@ -821,8 +816,15 @@
u->modargs = ma;
u->module = m;
+#if (PULSEAUDIO_VERSION >= 10)
+ pa_card_choose_initial_profile(u->card);
+#endif
init_profile(u);
+#if (PULSEAUDIO_VERSION >= 10)
+ pa_card_put(u->card);
+#endif
+
return 0;
fail:
|