Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 389ef25 in mainline


Ignore:
Timestamp:
2012-07-17T06:53:55Z (10 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial
Children:
950110ee
Parents:
bb67def
Message:

hound: Check format before starting playback.

Location:
uspace/srv/audio/hound
Files:
4 edited

Legend:

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

    rbb67def r389ef25  
    8080        init_common(client, name, f, sess);
    8181        audio_sink_init(&client->sink, name, client,
    82             client_sink_connection_change, f);
     82            client_sink_connection_change, NULL, f);
    8383        client->is_recording = true;
    8484        return client;
  • uspace/srv/audio/hound/audio_device.c

    rbb67def r389ef25  
    5151static int device_source_connection_callback(audio_source_t *source);
    5252static void device_event_callback(ipc_callid_t iid, ipc_call_t *icall, void *arg);
     53static int device_check_format(audio_sink_t* sink);
    5354static int get_buffer(audio_device_t *dev);
    5455static int release_buffer(audio_device_t *dev);
     
    6869
    6970        audio_sink_init(&dev->sink, name, dev, device_sink_connection_callback,
    70             &AUDIO_FORMAT_ANY);
     71            device_check_format, &AUDIO_FORMAT_ANY);
    7172        audio_source_init(&dev->source, name, dev,
    7273            device_source_connection_callback, NULL, &AUDIO_FORMAT_ANY);
     
    222223        }
    223224}
     225static int device_check_format(audio_sink_t* sink)
     226{
     227        assert(sink);
     228        audio_device_t *dev = sink->private_data;
     229        assert(dev);
     230        log_verbose("Checking format on sink %s", sink->name);
     231        return audio_pcm_test_format(dev->sess, &sink->format.channels,
     232            &sink->format.sampling_rate, &sink->format.sample_format);
     233}
    224234
    225235static int get_buffer(audio_device_t *dev)
  • 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}
  • uspace/srv/audio/hound/audio_sink.h

    rbb67def r389ef25  
    5454        void *private_data;
    5555        int (*connection_change)(audio_sink_t *, bool);
     56        int (*check_format)(audio_sink_t *);
    5657};
    5758
     
    6364int audio_sink_init(audio_sink_t *sink, const char *name,
    6465    void *private_data, int (*connection_change)(audio_sink_t *, bool),
    65     const audio_format_t *f);
     66    int (*check_format)(audio_sink_t *), const audio_format_t *f);
    6667void audio_sink_fini(audio_sink_t *sink);
    6768
     69int audio_sink_set_format(audio_sink_t *sink, const audio_format_t *format);
    6870int audio_sink_add_source(audio_sink_t *sink, audio_source_t *source);
    6971int audio_sink_remove_source(audio_sink_t *sink, audio_source_t *source);
Note: See TracChangeset for help on using the changeset viewer.