blob: 36d5496eeaa1630e06aa32e1dc76ce27b40aea27 [file] [log] [blame]
/* Copyright 2018 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include <syslog.h>
#include "cras_rstream.h"
#include "cras_server.h"
#include "cras_system_state.h"
#include "cras_types.h"
#include "server_stream.h"
#include "stream_list.h"
/* Parameters used for server stream. */
static unsigned int server_stream_block_size = 480;
/*
* Information of a stream created by server. Currently only
* one server stream is allowed, for echo reference use.
*/
static struct cras_rstream_config *stream_config;
/* Actually create the server stream and add to stream list. */
static void server_stream_add_cb(void *data)
{
struct stream_list *stream_list = (struct stream_list *)data;
struct cras_rstream *stream;
if (!stream_config)
return;
stream_list_add(stream_list, stream_config, &stream);
}
void server_stream_create(struct stream_list *stream_list, unsigned int dev_idx,
struct cras_audio_format *format)
{
int audio_fd = -1;
int client_shm_fd = -1;
uint64_t buffer_offsets[2] = { 0, 0 };
if (stream_config) {
syslog(LOG_ERR, "server stream already exists, dev %u",
stream_config->dev_idx);
return;
}
stream_config =
(struct cras_rstream_config *)calloc(1, sizeof(*stream_config));
cras_rstream_config_init(
/*client=*/NULL, cras_get_stream_id(SERVER_STREAM_CLIENT_ID, 0),
CRAS_STREAM_TYPE_DEFAULT, CRAS_CLIENT_TYPE_SERVER_STREAM,
CRAS_STREAM_INPUT, dev_idx,
/*flags=*/SERVER_ONLY,
/*effects=*/0, format, server_stream_block_size,
server_stream_block_size, &audio_fd, &client_shm_fd,
/*client_shm_size=*/0, buffer_offsets, stream_config);
/* Schedule add stream in next main thread loop. */
cras_system_add_task(server_stream_add_cb, stream_list);
}
static void server_stream_rm_cb(void *data)
{
struct stream_list *stream_list = (struct stream_list *)data;
if (stream_config == NULL)
return;
if (stream_list_rm(stream_list, stream_config->stream_id))
syslog(LOG_ERR, "Server stream %x no longer exist",
stream_config->stream_id);
free(stream_config);
stream_config = NULL;
}
void server_stream_destroy(struct stream_list *stream_list,
unsigned int dev_idx)
{
if (!stream_config || stream_config->dev_idx != dev_idx) {
syslog(LOG_ERR, "No server stream to destroy");
return;
}
server_stream_rm_cb(stream_list);
}