diff options
| author | Arun Raghavan <arun.raghavan@collabora.co.uk> | 2011-03-02 11:16:07 +0530 | 
|---|---|---|
| committer | Arun Raghavan <arun.raghavan@collabora.co.uk> | 2011-05-02 11:54:48 +0530 | 
| commit | 13229fb39e7b8cff3f114c98f8236d9123442243 (patch) | |
| tree | c411d776fabb3abb1c6a42dd83af69144f58c653 /src | |
| parent | 8ec0548f5f4c7ce3213e4639722d9cb78fc13b90 (diff) | |
sink-input: Don't assert on bad formats
Handles bad format input more gracefully and returns an error instead.
Diffstat (limited to 'src')
| -rw-r--r-- | src/pulse/format.c | 30 | ||||
| -rw-r--r-- | src/pulse/internal.h | 4 | ||||
| -rw-r--r-- | src/pulsecore/sink-input.c | 4 | 
3 files changed, 21 insertions, 17 deletions
diff --git a/src/pulse/format.c b/src/pulse/format.c index 4ecd75ee..af24eb2e 100644 --- a/src/pulse/format.c +++ b/src/pulse/format.c @@ -120,21 +120,21 @@ pa_format_info* pa_format_info_from_sample_spec(pa_sample_spec *ss, pa_channel_m  }  /* For PCM streams */ -void pa_format_info_to_sample_spec(pa_format_info *f, pa_sample_spec *ss, pa_channel_map *map) { +pa_bool_t pa_format_info_to_sample_spec(pa_format_info *f, pa_sample_spec *ss, pa_channel_map *map) {      const char *sf, *r, *ch;      uint32_t channels;      pa_assert(f);      pa_assert(ss); -    pa_assert(f->encoding == PA_ENCODING_PCM); +    pa_return_val_if_fail(f->encoding == PA_ENCODING_PCM, FALSE); -    pa_assert(sf = pa_proplist_gets(f->plist, PA_PROP_FORMAT_SAMPLE_FORMAT)); -    pa_assert(r = pa_proplist_gets(f->plist, PA_PROP_FORMAT_RATE)); -    pa_assert(ch = pa_proplist_gets(f->plist, PA_PROP_FORMAT_CHANNELS)); +    pa_return_val_if_fail(sf = pa_proplist_gets(f->plist, PA_PROP_FORMAT_SAMPLE_FORMAT), FALSE); +    pa_return_val_if_fail(r = pa_proplist_gets(f->plist, PA_PROP_FORMAT_RATE), FALSE); +    pa_return_val_if_fail(ch = pa_proplist_gets(f->plist, PA_PROP_FORMAT_CHANNELS), FALSE); -    pa_assert((ss->format = pa_parse_sample_format(sf)) != PA_SAMPLE_INVALID); -    pa_assert(pa_atou(r, &ss->rate) == 0); -    pa_assert(pa_atou(ch, &channels) == 0); +    pa_return_val_if_fail((ss->format = pa_parse_sample_format(sf)) != PA_SAMPLE_INVALID, FALSE); +    pa_return_val_if_fail(pa_atou(r, &ss->rate) == 0, FALSE); +    pa_return_val_if_fail(pa_atou(ch, &channels) == 0, FALSE);      ss->channels = (uint8_t) channels;      if (map) { @@ -142,21 +142,25 @@ void pa_format_info_to_sample_spec(pa_format_info *f, pa_sample_spec *ss, pa_cha          pa_channel_map_init(map);          if (m) -            pa_assert(pa_channel_map_parse(map, m) != NULL); +            pa_return_val_if_fail(pa_channel_map_parse(map, m) != NULL, FALSE);      } + +    return TRUE;  }  /* For compressed streams */ -void pa_format_info_to_sample_spec_fake(pa_format_info *f, pa_sample_spec *ss) { +pa_bool_t pa_format_info_to_sample_spec_fake(pa_format_info *f, pa_sample_spec *ss) {      const char *r;      pa_assert(f);      pa_assert(ss); -    pa_assert(f->encoding != PA_ENCODING_PCM); +    pa_return_val_if_fail(f->encoding != PA_ENCODING_PCM, FALSE);      ss->format = PA_SAMPLE_S16LE;      ss->channels = 2; -    pa_assert(r = pa_proplist_gets(f->plist, PA_PROP_FORMAT_RATE)); -    pa_assert(pa_atou(r, &ss->rate) == 0); +    pa_return_val_if_fail(r = pa_proplist_gets(f->plist, PA_PROP_FORMAT_RATE), FALSE); +    pa_return_val_if_fail(pa_atou(r, &ss->rate) == 0, FALSE); + +    return TRUE;  } diff --git a/src/pulse/internal.h b/src/pulse/internal.h index d7151653..228e8dc4 100644 --- a/src/pulse/internal.h +++ b/src/pulse/internal.h @@ -298,8 +298,8 @@ void pa_ext_stream_restore_command(pa_context *c, uint32_t tag, pa_tagstruct *t)  pa_bool_t pa_format_info_is_compatible(pa_format_info *first, pa_format_info *second);  pa_format_info* pa_format_info_from_sample_spec(pa_sample_spec *ss, pa_channel_map *map); -void pa_format_info_to_sample_spec(pa_format_info *f, pa_sample_spec *ss, pa_channel_map *map); -void pa_format_info_to_sample_spec_fake(pa_format_info *f, pa_sample_spec *ss); +pa_bool_t pa_format_info_to_sample_spec(pa_format_info *f, pa_sample_spec *ss, pa_channel_map *map); +pa_bool_t pa_format_info_to_sample_spec_fake(pa_format_info *f, pa_sample_spec *ss);  pa_bool_t pa_mainloop_is_our_api(pa_mainloop_api*m); diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c index 1706a7fb..a4659558 100644 --- a/src/pulsecore/sink-input.c +++ b/src/pulsecore/sink-input.c @@ -281,12 +281,12 @@ int pa_sink_input_new(      /* Now populate the sample spec and format according to the final       * format that we've negotiated */      if (PA_LIKELY(data->format->encoding == PA_ENCODING_PCM)) { -        pa_format_info_to_sample_spec(data->format, &ss, &map); +        pa_return_val_if_fail(pa_format_info_to_sample_spec(data->format, &ss, &map), -PA_ERR_INVALID);          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);      } else { -        pa_format_info_to_sample_spec_fake(data->format, &ss); +        pa_return_val_if_fail(pa_format_info_to_sample_spec_fake(data->format, &ss), -PA_ERR_INVALID);          pa_sink_input_new_data_set_sample_spec(data, &ss);          /* XXX: this is redundant - we can just check the encoding */          data->flags |= PA_SINK_INPUT_PASSTHROUGH;  | 
