Changeset 389ef25 in mainline for uspace/srv/audio/hound/audio_sink.c


Ignore:
Timestamp:
2012-07-17T06:53:55Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
950110ee
Parents:
bb67def
Message:

hound: Check format before starting playback.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/audio/hound/audio_sink.c

    rbb67def r389ef25  
    4646int audio_sink_init(audio_sink_t *sink, const char *name,
    4747    void *private_data, int (*connection_change)(audio_sink_t *, bool),
    48     const audio_format_t *f)
     48    int (*check_format)(audio_sink_t *sink), const audio_format_t *f)
    4949{
    5050        assert(sink);
     
    5959        sink->format = *f;
    6060        sink->connection_change = connection_change;
     61        sink->check_format = check_format;
    6162        log_verbose("Initialized sink (%p) '%s'", sink, sink->name);
    6263        return EOK;
     
    7071        sink->name = NULL;
    7172}
    72 
    7373
    7474int audio_sink_add_source(audio_sink_t *sink, audio_source_t *source)
     
    8585                /* Set audio format according to the first source */
    8686                if (audio_format_is_any(&sink->format)) {
    87                         /* Source does not care */
    88                         if (audio_format_is_any(&source->format)) {
    89                                 log_verbose("Set default format for sink %s.",
    90                                     sink->name);
    91                                 sink->format = AUDIO_FORMAT_DEFAULT;
    92                         } else {
    93                                 log_verbose("Set format based on the first "
    94                                     "source(%s): %u channel(s), %uHz, %s for "
    95                                     "sink %s.", source->name,
    96                                     source->format.channels,
    97                                     source->format.sampling_rate,
    98                                     pcm_sample_format_str(
    99                                         source->format.sample_format),
    100                                     sink->name);
    101                                 sink->format = source->format;
    102                         }
     87                        int ret = audio_sink_set_format(sink, &source->format);
     88                        if (ret != EOK)
     89                                return ret;
    10390                }
    10491        }
     
    120107            source->name, sink->name);
    121108
     109        return EOK;
     110}
     111
     112int audio_sink_set_format(audio_sink_t *sink, const audio_format_t *format)
     113{
     114        assert(sink);
     115        assert(format);
     116        if (!audio_format_is_any(&sink->format)) {
     117                log_debug("Sink %s already has a format", sink->name);
     118                return EEXISTS;
     119        }
     120        const audio_format_t old_format;
     121
     122        if (audio_format_is_any(format)) {
     123                log_verbose("Setting DEFAULT format for sink %s", sink->name);
     124                sink->format = AUDIO_FORMAT_DEFAULT;
     125        } else {
     126                sink->format = *format;
     127        }
     128        if (sink->check_format) {
     129                const int ret = sink->check_format(sink);
     130                if (ret != EOK && ret != ELIMIT) {
     131                        log_debug("Format check failed on sink %s", sink->name);
     132                        sink->format = old_format;
     133                        return ret;
     134                }
     135        }
     136        log_verbose("Set format for sink %s: %u channel(s), %uHz, %s",
     137            sink->name, format->channels, format->sampling_rate,
     138            pcm_sample_format_str(format->sample_format));
    122139        return EOK;
    123140}
Note: See TracChangeset for help on using the changeset viewer.