Home | History | Annotate | Download | only in server
      1 /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 #include <pthread.h>
      7 #include <sys/param.h>
      8 #include <syslog.h>
      9 
     10 #include "byte_buffer.h"
     11 #include "cras_audio_area.h"
     12 #include "cras_config.h"
     13 #include "cras_iodev.h"
     14 #include "cras_iodev_list.h"
     15 #include "cras_types.h"
     16 #include "cras_util.h"
     17 #include "sfh.h"
     18 #include "utlist.h"
     19 
     20 #define LOOPBACK_BUFFER_SIZE 8192
     21 
     22 static const char *loopdev_names[LOOPBACK_NUM_TYPES] = {
     23 	"Post Mix Pre DSP Loopback",
     24 	"Post DSP Loopback",
     25 };
     26 
     27 static size_t loopback_supported_rates[] = {
     28 	48000, 0
     29 };
     30 
     31 static size_t loopback_supported_channel_counts[] = {
     32 	2, 0
     33 };
     34 
     35 static snd_pcm_format_t loopback_supported_formats[] = {
     36 	SND_PCM_FORMAT_S16_LE,
     37 	0
     38 };
     39 
     40 /* loopack iodev.  Keep state of a loopback device.
     41  *    sample_buffer - Pointer to sample buffer.
     42  */
     43 struct loopback_iodev {
     44 	struct cras_iodev base;
     45 	enum CRAS_LOOPBACK_TYPE loopback_type;
     46 	struct timespec last_filled;
     47 	struct byte_buffer *sample_buffer;
     48 };
     49 
     50 static int sample_hook(const uint8_t *frames, unsigned int nframes,
     51 		       const struct cras_audio_format *fmt,
     52 		       void *cb_data)
     53 {
     54 	struct loopback_iodev *loopdev = (struct loopback_iodev *)cb_data;
     55 	struct byte_buffer *sbuf = loopdev->sample_buffer;
     56 	unsigned int frame_bytes = cras_get_format_bytes(fmt);
     57 	unsigned int frames_to_copy, bytes_to_copy;
     58 	struct cras_iodev *edev = cras_iodev_list_get_first_enabled_iodev(
     59 			CRAS_STREAM_OUTPUT);
     60 
     61 	/* If there's no active streams, the logic in frames_queued will fill
     62 	 * zeros for loopback capture, do not accept zeros for draining device.
     63 	 */
     64 	if (!edev || !edev->streams)
     65 		return 0;
     66 
     67 	frames_to_copy = MIN(buf_writable_bytes(sbuf) / frame_bytes, nframes);
     68 	if (!frames_to_copy)
     69 		return 0;
     70 
     71 	bytes_to_copy = frames_to_copy * frame_bytes;
     72 	memcpy(buf_write_pointer(sbuf), frames, bytes_to_copy);
     73 	buf_increment_write(sbuf, bytes_to_copy);
     74 	clock_gettime(CLOCK_MONOTONIC_RAW, &loopdev->last_filled);
     75 
     76 	return frames_to_copy;
     77 }
     78 
     79 static void register_loopback_hook(enum CRAS_LOOPBACK_TYPE loopback_type,
     80 				   struct cras_iodev *iodev,
     81 				   loopback_hook_t hook, void *cb_data)
     82 {
     83 	if (!iodev) {
     84 		syslog(LOG_ERR, "Failed to register loopback hook.");
     85 		return;
     86 	}
     87 
     88 	if (loopback_type == LOOPBACK_POST_MIX_PRE_DSP)
     89 		cras_iodev_register_pre_dsp_hook(iodev, hook, cb_data);
     90 	else if (loopback_type == LOOPBACK_POST_DSP)
     91 		cras_iodev_register_post_dsp_hook(iodev, hook, cb_data);
     92 }
     93 
     94 static void device_enabled_hook(struct cras_iodev *iodev, int enabled,
     95 				void *cb_data)
     96 {
     97 	struct loopback_iodev *loopdev = (struct loopback_iodev *)cb_data;
     98 	struct cras_iodev *edev;
     99 
    100 	if (iodev->direction != CRAS_STREAM_OUTPUT)
    101 		return;
    102 
    103 	if (!enabled) {
    104 		/* Unregister loopback hook from disabled iodev. */
    105 		register_loopback_hook(loopdev->loopback_type, iodev, NULL,
    106 				       NULL);
    107 	} else {
    108 		/* Register loopback hook onto first enabled iodev. */
    109 		edev = cras_iodev_list_get_first_enabled_iodev(
    110 				CRAS_STREAM_OUTPUT);
    111 		register_loopback_hook(loopdev->loopback_type, edev,
    112 				       sample_hook, cb_data);
    113 	}
    114 }
    115 
    116 /*
    117  * iodev callbacks.
    118  */
    119 
    120 static int frames_queued(const struct cras_iodev *iodev,
    121 			 struct timespec *hw_tstamp)
    122 {
    123 	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
    124 	struct byte_buffer *sbuf = loopdev->sample_buffer;
    125 	unsigned int frame_bytes = cras_get_format_bytes(iodev->format);
    126 	struct cras_iodev *edev = cras_iodev_list_get_first_enabled_iodev(
    127 			CRAS_STREAM_OUTPUT);
    128 
    129 	if (!edev || !edev->streams) {
    130 		unsigned int frames_since_last, frames_to_fill, bytes_to_fill;
    131 
    132 		frames_since_last = cras_frames_since_time(
    133 				&loopdev->last_filled,
    134 				iodev->format->frame_rate);
    135 		frames_to_fill = MIN(buf_writable_bytes(sbuf) / frame_bytes,
    136 				     frames_since_last);
    137 		if (frames_to_fill > 0) {
    138 			bytes_to_fill = frames_to_fill * frame_bytes;
    139 			memset(buf_write_pointer(sbuf), 0, bytes_to_fill);
    140 			buf_increment_write(sbuf, bytes_to_fill);
    141 			clock_gettime(CLOCK_MONOTONIC_RAW,
    142 				      &loopdev->last_filled);
    143 		}
    144 	}
    145 	*hw_tstamp = loopdev->last_filled;
    146 	return buf_queued_bytes(sbuf) / frame_bytes;
    147 }
    148 
    149 static int delay_frames(const struct cras_iodev *iodev)
    150 {
    151 	struct timespec tstamp;
    152 
    153 	return frames_queued(iodev, &tstamp);
    154 }
    155 
    156 static int close_record_dev(struct cras_iodev *iodev)
    157 {
    158 	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
    159 	struct byte_buffer *sbuf = loopdev->sample_buffer;
    160 	struct cras_iodev *edev;
    161 
    162 	cras_iodev_free_format(iodev);
    163 	cras_iodev_free_audio_area(iodev);
    164 	buf_reset(sbuf);
    165 
    166 	edev = cras_iodev_list_get_first_enabled_iodev(CRAS_STREAM_OUTPUT);
    167 	register_loopback_hook(loopdev->loopback_type, edev, NULL, NULL);
    168 	cras_iodev_list_set_device_enabled_callback(NULL, NULL);
    169 
    170 	return 0;
    171 }
    172 
    173 static int open_record_dev(struct cras_iodev *iodev)
    174 {
    175 	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
    176 	struct cras_iodev *edev;
    177 
    178 	cras_iodev_init_audio_area(iodev, iodev->format->num_channels);
    179 	clock_gettime(CLOCK_MONOTONIC_RAW, &loopdev->last_filled);
    180 
    181 	edev = cras_iodev_list_get_first_enabled_iodev(CRAS_STREAM_OUTPUT);
    182 	register_loopback_hook(loopdev->loopback_type, edev, sample_hook,
    183 			       (void *)iodev);
    184 	cras_iodev_list_set_device_enabled_callback(device_enabled_hook,
    185 						    (void *)iodev);
    186 
    187 	return 0;
    188 }
    189 
    190 static int get_record_buffer(struct cras_iodev *iodev,
    191 		      struct cras_audio_area **area,
    192 		      unsigned *frames)
    193 {
    194 	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
    195 	struct byte_buffer *sbuf = loopdev->sample_buffer;
    196 	unsigned int frame_bytes = cras_get_format_bytes(iodev->format);
    197 	unsigned int avail_frames = buf_readable_bytes(sbuf) / frame_bytes;
    198 
    199 	*frames = MIN(avail_frames, *frames);
    200 	iodev->area->frames = *frames;
    201 	cras_audio_area_config_buf_pointers(iodev->area, iodev->format,
    202 					    buf_read_pointer(sbuf));
    203 	*area = iodev->area;
    204 
    205 	return 0;
    206 }
    207 
    208 static int put_record_buffer(struct cras_iodev *iodev, unsigned nframes)
    209 {
    210 	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
    211 	struct byte_buffer *sbuf = loopdev->sample_buffer;
    212 	unsigned int frame_bytes = cras_get_format_bytes(iodev->format);
    213 
    214 	buf_increment_read(sbuf, nframes * frame_bytes);
    215 
    216 	return 0;
    217 }
    218 
    219 static int flush_record_buffer(struct cras_iodev *iodev)
    220 {
    221 	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
    222 	struct byte_buffer *sbuf = loopdev->sample_buffer;
    223 	unsigned int queued_bytes = buf_queued_bytes(sbuf);
    224 	buf_increment_read(sbuf, queued_bytes);
    225 	return 0;
    226 }
    227 
    228 static void update_active_node(struct cras_iodev *iodev, unsigned node_idx,
    229 			       unsigned dev_enabled)
    230 {
    231 }
    232 
    233 static struct cras_iodev *create_loopback_iodev(enum CRAS_LOOPBACK_TYPE type)
    234 {
    235 	struct loopback_iodev *loopback_iodev;
    236 	struct cras_iodev *iodev;
    237 
    238 	loopback_iodev = calloc(1, sizeof(*loopback_iodev));
    239 	if (loopback_iodev == NULL)
    240 		return NULL;
    241 
    242 	loopback_iodev->sample_buffer = byte_buffer_create(1024*16*4);
    243 	if (loopback_iodev->sample_buffer == NULL) {
    244 		free(loopback_iodev);
    245 		return NULL;
    246 	}
    247 
    248 	loopback_iodev->loopback_type = type;
    249 
    250 	iodev = &loopback_iodev->base;
    251 	iodev->direction = CRAS_STREAM_INPUT;
    252 	snprintf(iodev->info.name, ARRAY_SIZE(iodev->info.name), "%s",
    253 		 loopdev_names[type]);
    254 	iodev->info.name[ARRAY_SIZE(iodev->info.name) - 1] = '\0';
    255 	iodev->info.stable_id = SuperFastHash(iodev->info.name,
    256 					      strlen(iodev->info.name),
    257 					      strlen(iodev->info.name));
    258 	iodev->info.stable_id_new = iodev->info.stable_id;
    259 
    260 	iodev->supported_rates = loopback_supported_rates;
    261 	iodev->supported_channel_counts = loopback_supported_channel_counts;
    262 	iodev->supported_formats = loopback_supported_formats;
    263 	iodev->buffer_size = LOOPBACK_BUFFER_SIZE;
    264 
    265 	iodev->frames_queued = frames_queued;
    266 	iodev->delay_frames = delay_frames;
    267 	iodev->update_active_node = update_active_node;
    268 	iodev->open_dev = open_record_dev;
    269 	iodev->close_dev = close_record_dev;
    270 	iodev->get_buffer = get_record_buffer;
    271 	iodev->put_buffer = put_record_buffer;
    272 	iodev->flush_buffer = flush_record_buffer;
    273 
    274 	return iodev;
    275 }
    276 
    277 /*
    278  * Exported Interface.
    279  */
    280 
    281 struct cras_iodev *loopback_iodev_create(enum CRAS_LOOPBACK_TYPE type)
    282 {
    283 	struct cras_iodev *iodev;
    284 	struct cras_ionode *node;
    285 	enum CRAS_NODE_TYPE node_type;
    286 
    287 	switch (type) {
    288 	case LOOPBACK_POST_MIX_PRE_DSP:
    289 		node_type = CRAS_NODE_TYPE_POST_MIX_PRE_DSP;
    290 		break;
    291 	case LOOPBACK_POST_DSP:
    292 		node_type = CRAS_NODE_TYPE_POST_DSP;
    293 		break;
    294 	default:
    295 		return NULL;
    296 	}
    297 
    298 	iodev = create_loopback_iodev(type);
    299 	if (iodev == NULL)
    300 		return NULL;
    301 
    302 	/* Create a dummy ionode */
    303 	node = (struct cras_ionode *)calloc(1, sizeof(*node));
    304 	node->dev = iodev;
    305 	node->type = node_type;
    306 	node->plugged = 1;
    307 	node->volume = 100;
    308 	node->stable_id = iodev->info.stable_id;
    309 	node->stable_id_new = iodev->info.stable_id_new;
    310 	node->software_volume_needed = 0;
    311 	node->max_software_gain = 0;
    312 	strcpy(node->name, loopdev_names[type]);
    313 	cras_iodev_add_node(iodev, node);
    314 	cras_iodev_set_active_node(iodev, node);
    315 
    316 	cras_iodev_list_add_input(iodev);
    317 
    318 	return iodev;
    319 }
    320 
    321 void loopback_iodev_destroy(struct cras_iodev *iodev)
    322 {
    323 	struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
    324 	struct byte_buffer *sbuf = loopdev->sample_buffer;
    325 
    326 	cras_iodev_list_rm_input(iodev);
    327 
    328 	byte_buffer_destroy(sbuf);
    329 	free(loopdev);
    330 }
    331