C++程序  |  77行  |  1.73 KB

/* Copyright (c) 2015 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.
 *
 * This example plays a file.  The filename is the only argument.  The file is
 * assumed to contain raw stereo 16-bit PCM data to be played at 48kHz.
 * usage:  cplay <filename>
 */

#include <cras_client.h>
#include <cras_helpers.h>
#include <sys/param.h>
#include <stdio.h>
#include <stdint.h>

int main(int argc, char **argv)
{
	struct cras_client *client;
	cras_stream_id_t stream_id;
	int rc = 0;
	int fd;
	const unsigned int num_channels = 2;
	const unsigned int rate = 48000;
	const unsigned int flags = 0;
	uint8_t *buffer;
	int nread;

	if (argc < 2)
		printf("Usage: %s filename\n", argv[0]);

	fd = open(argv[1], O_RDONLY);
	if (fd < 0) {
		perror("failed to open file");
		return -errno;
	}

	buffer = malloc(48000 * 4 * 5);

	nread = read(fd, buffer, 48000 * 4 * 5);
	if (nread <= 0) {
		free(buffer);
		close(fd);
		return nread;
	}

	rc = cras_helper_create_connect(&client);
	if (rc < 0) {
		fprintf(stderr, "Couldn't create client.\n");
		free(buffer);
		close(fd);
		return rc;
	}

	rc = cras_helper_play_buffer(client, buffer, nread / 4,
			SND_PCM_FORMAT_S16_LE, rate, num_channels,
			cras_client_get_first_dev_type_idx(
				client, CRAS_NODE_TYPE_INTERNAL_SPEAKER,
				CRAS_STREAM_OUTPUT));
	if (rc < 0) {
		fprintf(stderr, "playing a buffer %d\n", rc);
		goto destroy_exit;
	}

	/* At this point the stream has been added and audio callbacks will
	 * start to fire.  This app can now go off and do other things, but this
	 * example just loops forever. */
	while (1) {
		sleep(1);
	}

destroy_exit:
	cras_client_destroy(client);
	free(buffer);
	close(fd);
	return rc;
}