⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ao_esd.c

📁 libao-0.8.5.tar.gz 通过联合libmad-0.15.0b.tar
💻 C
字号:
/* * *  ao_esd.c * *      Copyright (C) Stan Seibert - July 2000, July 2001 * *  This file is part of libao, a cross-platform 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 <unistd.h>#include <stdlib.h>#include <dirent.h>#include <sys/stat.h>#include <string.h>#include <esd.h>#include <ao/ao.h>#include <ao/plugin.h>static char *ao_esd_options[] = {"host"};static ao_info ao_esd_info ={	AO_TYPE_LIVE,	"ESounD output",	"esd",	"Stan Seibert <volsung@asu.edu>",	"Outputs to the Enlightened Sound Daemon.",	AO_FMT_NATIVE,	40,	ao_esd_options,	1};typedef struct ao_esd_internal{	int sock;	char *host;} ao_esd_internal;int ao_plugin_test(){	int sock;	/* don't wake up the beast while detecting */	putenv("ESD_NO_SPAWN=1"); 	sock = esd_open_sound(NULL);	if (sock < 0)		return 0;	if (esd_get_standby_mode(sock) != ESM_RUNNING) {		esd_close(sock);		return 0;	}	esd_close(sock);	return 1;}ao_info *ao_plugin_driver_info(void){	return &ao_esd_info;}int ao_plugin_device_init(ao_device *device){	ao_esd_internal *internal;	internal = (ao_esd_internal *) malloc(sizeof(ao_esd_internal));	if (internal == NULL)			return 0; /* Could not initialize device memory */		internal->host = NULL;		device->internal = internal;	return 1; /* Memory alloc successful */}int ao_plugin_set_option(ao_device *device, const char *key, const char *value){	ao_esd_internal *internal = (ao_esd_internal *) device->internal;	if (!strcmp(key, "host")) {		free(internal->host);		internal->host = strdup(value);	}	return 1;}int ao_plugin_open(ao_device *device, ao_sample_format *format){	ao_esd_internal *internal = (ao_esd_internal *) device->internal;	int esd_bits;	int esd_channels;	int esd_mode = ESD_STREAM;	int esd_func = ESD_PLAY;	int esd_format;	switch (format->bits)	{	case 8  : esd_bits = ESD_BITS8;		  break;	case 16 : esd_bits = ESD_BITS16;		  break;	default : return 0;	}	switch (format->channels)	{	case 1 : esd_channels = ESD_MONO;		 break;	case 2 : esd_channels = ESD_STEREO;		 break;	default: return 0;	}		esd_format = esd_bits | esd_channels | esd_mode | esd_func;	internal->sock = esd_play_stream(esd_format, format->rate, 					 internal->host,					 "libao output");	if (internal->sock < 0)		return 0; /* Could not contact ESD server */		device->driver_byte_format = AO_FMT_NATIVE;	return 1;}int ao_plugin_play(ao_device *device, const char* output_samples, 		uint_32 num_bytes){	ao_esd_internal *internal = (ao_esd_internal *) device->internal;	if (write(internal->sock, output_samples, num_bytes) < 0)		return 0;	else		return 1;}int ao_plugin_close(ao_device *device){	ao_esd_internal *internal = (ao_esd_internal *) device->internal;	close(internal->sock);	return 1;}void ao_plugin_device_clear(ao_device *device){	ao_esd_internal *internal = (ao_esd_internal *) device->internal;	free(internal->host);	free(internal);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -