Skip to content
Snippets Groups Projects
ao_raw.c 3.1 KiB
Newer Older
/*
 *
 *  ao_raw.c
 *
 *      Copyright (C) Stan Seibert - January 2001, July 2001
 *
 *  This file is part of libao, a cross-platform audio output library.  See
 *  README for a history of this source code.
 *
 *  libao is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  libao is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with GNU Make; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <ao/ao.h>
#include <ao/plugin.h>
static char *ao_raw_options[] = {"byteorder"};
static ao_info ao_raw_info =
	"RAW sample output",
	"raw",
	"Stan Seibert <indigo@aztec.asu.edu>",
	"Writes raw audio samples to a file",
	AO_FMT_NATIVE,
	0,
	ao_raw_options,
	1
typedef struct ao_raw_internal
	int byte_order;
} ao_raw_internal;
static int ao_raw_test(void)
	return 1; /* Always works */
}

static ao_info *ao_raw_driver_info(void)
{
	return &ao_raw_info;

static int ao_raw_device_init(ao_device *device)
	ao_raw_internal *internal;
	internal = (ao_raw_internal *) malloc(sizeof(ao_raw_internal));
	if (internal == NULL)	
		return 0; /* Could not initialize device memory */
	
	internal->byte_order = AO_FMT_NATIVE;
	
	device->internal = internal;
	return 1; /* Memory alloc successful */
}
static int ao_raw_set_option(ao_device *device, const char *key, 
			      const char *value)
{
	ao_raw_internal *internal = (ao_raw_internal *)device->internal;
	
	if (!strcmp(key, "byteorder")) {    
		if (!strcmp(value, "native"))
			internal->byte_order = AO_FMT_NATIVE;
		else if (!strcmp(value, "big"))
			internal->byte_order = AO_FMT_BIG;
		else if (!strcmp(value, "little"))
			internal->byte_order = AO_FMT_LITTLE;
		else
			return 0; /* Bad option value */

static int ao_raw_open(ao_device *device, ao_sample_format *format)
{
	ao_raw_internal *internal = (ao_raw_internal *)device->internal;

	device->driver_byte_format = internal->byte_order;

	return 1;
}


/*
 * play the sample to the already opened file descriptor
 */
static int ao_raw_play(ao_device *device, const char *output_samples, 
		       uint_32 num_bytes)
	if (fwrite(output_samples, sizeof(char), num_bytes, 
		   device->file) < num_bytes)
		return 0;
	else
		return 1;
static int ao_raw_close(ao_device *device)
	/* No closeout needed */
	return 1;

static void ao_raw_device_clear(ao_device *device)
	ao_raw_internal *internal = (ao_raw_internal *) device->internal;

	free(internal);

ao_functions ao_raw = {
	ao_raw_test,
	ao_raw_driver_info,
	ao_raw_device_init,
	ao_raw_set_option,
	ao_raw_open,
	ao_raw_play,
	ao_raw_close,
	ao_raw_device_clear