diff options
Diffstat (limited to 'src/pulsecore')
-rw-r--r-- | src/pulsecore/protocol-native.c | 19 | ||||
-rw-r--r-- | src/pulsecore/svolume_mmx.c | 12 | ||||
-rw-r--r-- | src/pulsecore/svolume_sse.c | 12 |
3 files changed, 36 insertions, 7 deletions
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c index d8df8604..b16793d9 100644 --- a/src/pulsecore/protocol-native.c +++ b/src/pulsecore/protocol-native.c @@ -1037,6 +1037,9 @@ static playback_stream* playback_stream_new( pa_bool_t relative_volume, int *ret) { + /* Note: This function takes ownership of the 'formats' param, so we need + * to take extra care to not leak it */ + playback_stream *s, *ssync; pa_sink_input *sink_input = NULL; pa_memchunk silence; @@ -1067,7 +1070,7 @@ static playback_stream* playback_stream_new( sink = ssync->sink_input->sink; else if (sink != ssync->sink_input->sink) { *ret = PA_ERR_INVALID; - return NULL; + goto out; } } @@ -1083,8 +1086,11 @@ static playback_stream* playback_stream_new( pa_sink_input_new_data_set_sample_spec(&data, ss); if (pa_channel_map_valid(map)) pa_sink_input_new_data_set_channel_map(&data, map); - if (formats) + if (formats) { pa_sink_input_new_data_set_formats(&data, formats); + /* Ownership transferred to new_data, so we don't free it ourseleves */ + formats = NULL; + } if (volume) { pa_sink_input_new_data_set_volume(&data, volume); data.volume_is_absolute = !relative_volume; @@ -1102,7 +1108,7 @@ static playback_stream* playback_stream_new( pa_sink_input_new_data_done(&data); if (!sink_input) - return NULL; + goto out; s = pa_msgobject_new(playback_stream); s->parent.parent.parent.free = playback_stream_free; @@ -1164,6 +1170,11 @@ static playback_stream* playback_stream_new( (double) s->configured_sink_latency / PA_USEC_PER_MSEC); pa_sink_input_put(s->sink_input); + +out: + if (formats) + pa_idxset_free(formats, (pa_free2_cb_t) pa_format_info_free2, NULL); + return s; } @@ -2071,6 +2082,8 @@ static void command_create_playback_stream(pa_pdispatch *pd, uint32_t command, u muted_set = muted_set || muted; s = playback_stream_new(c, sink, &ss, &map, formats, &attr, volume_set ? &volume : NULL, muted, muted_set, syncid, &missing, flags, p, adjust_latency, early_requests, relative_volume, &ret); + /* We no longer own the formats idxset */ + formats = NULL; CHECK_VALIDITY_GOTO(c->pstream, s, tag, ret, finish); diff --git a/src/pulsecore/svolume_mmx.c b/src/pulsecore/svolume_mmx.c index 7286b4a2..28bbfdd3 100644 --- a/src/pulsecore/svolume_mmx.c +++ b/src/pulsecore/svolume_mmx.c @@ -155,7 +155,11 @@ static void pa_volume_s16ne_mmx(int16_t *samples, int32_t *volumes, unsigned cha " emms \n\t" : "+r" (samples), "+r" (volumes), "+r" (length), "=D" (channel), "=&r" (temp) - : "rm" ((pa_reg_x86)channels) +#if defined (__i386__) + : "m" ((pa_reg_x86)channels) +#else + : "r" ((pa_reg_x86)channels) +#endif : "cc" ); } @@ -230,7 +234,11 @@ static void pa_volume_s16re_mmx(int16_t *samples, int32_t *volumes, unsigned cha " emms \n\t" : "+r" (samples), "+r" (volumes), "+r" (length), "=D" (channel), "=&r" (temp) - : "rm" ((pa_reg_x86)channels) +#if defined (__i386__) + : "m" ((pa_reg_x86)channels) +#else + : "r" ((pa_reg_x86)channels) +#endif : "cc" ); } diff --git a/src/pulsecore/svolume_sse.c b/src/pulsecore/svolume_sse.c index 8fed69b2..dcd71c4b 100644 --- a/src/pulsecore/svolume_sse.c +++ b/src/pulsecore/svolume_sse.c @@ -154,7 +154,11 @@ static void pa_volume_s16ne_sse2(int16_t *samples, int32_t *volumes, unsigned ch "8: \n\t" : "+r" (samples), "+r" (volumes), "+r" (length), "=D" (channel), "=&r" (temp) - : "rm" ((pa_reg_x86)channels) +#if defined (__i386__) + : "m" ((pa_reg_x86)channels) +#else + : "r" ((pa_reg_x86)channels) +#endif : "cc" ); } @@ -242,7 +246,11 @@ static void pa_volume_s16re_sse2(int16_t *samples, int32_t *volumes, unsigned ch "8: \n\t" : "+r" (samples), "+r" (volumes), "+r" (length), "=D" (channel), "=&r" (temp) - : "rm" ((pa_reg_x86)channels) +#if defined (__i386__) + : "m" ((pa_reg_x86)channels) +#else + : "r" ((pa_reg_x86)channels) +#endif : "cc" ); } |