blob: 0911b95d3ea99bfcb23094a48bb91d786ca360f3 [file] [log] [blame]
/*
* Copyright 2013 Google Inc. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*/
#include <libpayload.h>
#include "base/container_of.h"
#include "base/list.h"
#include "drivers/sound/route.h"
static int route_enable_components(SoundRoute *route)
{
int res = 0;
SoundRouteComponent *component;
list_for_each(component, route->components, list_node) {
if (!component->enabled) {
if (component->ops.enable(&component->ops))
res = -1;
else
component->enabled = 1;
}
}
return res;
}
static int route_start(SoundOps *me, uint32_t frequency)
{
SoundRoute *route = container_of(me, SoundRoute, ops);
if (route_enable_components(route))
return 1;
if (!route->source->start)
return -1;
return route->source->start(route->source, frequency);
}
static int route_stop(SoundOps *me)
{
SoundRoute *route = container_of(me, SoundRoute, ops);
if (!route->source->stop)
return -1;
return route->source->stop(route->source);
}
static int route_play(SoundOps *me, uint32_t msec, uint32_t frequency)
{
SoundRoute *route = container_of(me, SoundRoute, ops);
if (route_enable_components(route))
return 1;
if (!route->source->play)
return -1;
return route->source->play(route->source, msec, frequency);
}
SoundRoute *new_sound_route(SoundOps *source)
{
SoundRoute *route = xzalloc(sizeof(*route));
route->ops.start = &route_start;
route->ops.stop = &route_stop;
route->ops.play = &route_play;
route->source = source;
return route;
}