Changeset 1df3018a in mainline for uspace/srv/audio/hound/hound.c


Ignore:
Timestamp:
2012-07-13T03:24:17Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d93a5a6f
Parents:
d01e635
Message:

hound: Only few more TODOs left

File:
1 edited

Legend:

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

    rd01e635 r1df3018a  
    3939
    4040#include "hound.h"
     41#include "audio_client.h"
    4142#include "audio_device.h"
    4243#include "audio_sink.h"
     
    4647#include "str_error.h"
    4748
     49#define FIND_BY_NAME(type) \
     50do { \
     51        assert(list); \
     52        assert(name); \
     53        list_foreach(*list, it) { \
     54                audio_ ## type ## _t *dev = \
     55                    audio_ ## type ## _list_instance(it); \
     56                if (str_cmp(name, dev->name) == 0) { \
     57                        log_debug("%s with name %s is already present", \
     58                            #type, name); \
     59                        return NULL; \
     60                } \
     61        } \
     62        return NULL; \
     63} while (0)
     64
     65static audio_device_t * find_device_by_name(list_t *list, const char *name)
     66{
     67        FIND_BY_NAME(device);
     68}
     69static audio_source_t * find_source_by_name(list_t *list, const char *name)
     70{
     71        FIND_BY_NAME(source);
     72}
     73static audio_sink_t * find_sink_by_name(list_t *list, const char *name)
     74{
     75        FIND_BY_NAME(sink);
     76}
     77
    4878int hound_init(hound_t *hound)
    4979{
    5080        assert(hound);
     81        fibril_mutex_initialize(&hound->list_guard);
    5182        list_initialize(&hound->devices);
     83        list_initialize(&hound->sources);
    5284        list_initialize(&hound->available_sources);
    5385        list_initialize(&hound->sinks);
    54         list_initialize(&hound->clients);
    5586        return EOK;
    5687}
    5788
    58 int hound_add_device(hound_t *hound, service_id_t id, const char* name)
     89int hound_add_device(hound_t *hound, service_id_t id, const char *name)
    5990{
    6091        log_verbose("Adding device \"%s\", service: %zu", name, id);
     
    6798
    6899        list_foreach(hound->devices, it) {
    69                 audio_device_t *dev = list_audio_device_instance(it);
     100                audio_device_t *dev = audio_device_list_instance(it);
    70101                if (dev->id == id) {
    71102                        log_debug("Device with id %zu is already present", id);
     
    74105        }
    75106
    76         audio_device_t *dev = malloc(sizeof(audio_device_t));
     107        audio_device_t *dev = find_device_by_name(&hound->devices, name);
     108        if (dev) {
     109                log_debug("Device with name %s is already present", name);
     110                return EEXISTS;
     111        }
     112
     113        dev = malloc(sizeof(audio_device_t));
    77114        if (!dev) {
    78115                log_debug("Failed to malloc device structure.");
     
    80117        }
    81118        const int ret = audio_device_init(dev, id, name);
     119        free(name);
    82120        if (ret != EOK) {
    83121                log_debug("Failed to initialize new audio device: %s",
     
    88126
    89127        list_append(&dev->link, &hound->devices);
    90         log_info("Added new device: '%s'", name);
     128        log_info("Added new device: '%s'", dev->name);
    91129
    92130        audio_source_t *source = audio_device_get_source(dev);
    93131        if (source) {
     132                const int ret = hound_add_source(hound, source);
     133                if (ret != EOK) {
     134                        log_debug("Failed to add device source: %s",
     135                            str_error(ret));
     136                        audio_device_fini(dev);
     137                        return ret;
     138                }
    94139                log_verbose("Added source: '%s'.", source->name);
    95                 list_append(&source->link, &hound->available_sources);
    96140        }
    97141
    98142        audio_sink_t *sink = audio_device_get_sink(dev);
    99143        if (sink) {
     144                const int ret = hound_add_sink(hound, sink);
     145                if (ret != EOK) {
     146                        log_debug("Failed to add device sink: %s",
     147                            str_error(ret));
     148                        audio_device_fini(dev);
     149                        return ret;
     150                }
    100151                log_verbose("Added sink: '%s'.", sink->name);
    101                 list_append(&sink->link, &hound->sinks);
    102152        }
    103153
     
    108158}
    109159
     160int hound_add_source(hound_t *hound, audio_source_t *source)
     161{
     162        assert(hound);
     163        if (!source || !source->name) {
     164                log_debug("Invalid source specified.");
     165                return EINVAL;
     166        }
     167        fibril_mutex_lock(&hound->list_guard);
     168        if (find_source_by_name(&hound->sources, source->name)) {
     169                log_debug("Source by that name already exists");
     170                fibril_mutex_unlock(&hound->list_guard);
     171                return EEXISTS;
     172        }
     173        list_foreach(hound->sinks, it) {
     174                audio_sink_t *sink = audio_sink_list_instance(it);
     175                if (find_source_by_name(&sink->sources, source->name)) {
     176                        log_debug("Source by that name already exists");
     177                        fibril_mutex_unlock(&hound->list_guard);
     178                        return EEXISTS;
     179                }
     180        }
     181        list_append(&source->link, &hound->sources);
     182        fibril_mutex_unlock(&hound->list_guard);
     183        return EOK;
     184}
     185
     186int hound_add_sink(hound_t *hound, audio_sink_t *sink)
     187{
     188        assert(hound);
     189        if (!sink || !sink->name) {
     190                log_debug("Invalid source specified.");
     191                return EINVAL;
     192        }
     193        fibril_mutex_lock(&hound->list_guard);
     194        if (find_sink_by_name(&hound->sinks, sink->name)) {
     195                log_debug("Sink by that name already exists");
     196                fibril_mutex_unlock(&hound->list_guard);
     197                return EEXISTS;
     198        }
     199        list_append(&sink->link, &hound->sinks);
     200        fibril_mutex_unlock(&hound->list_guard);
     201        return EOK;
     202}
     203
    110204/**
    111205 * @}
Note: See TracChangeset for help on using the changeset viewer.