This is soundaix.c in view mode; [Download] [Up]
/* * soundaix.c - Implementation of the AIX sound device * * Written by * Chris Sharp (sharpc@hursley.ibm.com) * * Integration with the other sound code * Teemu Rantanen (tvr@cs.hut.fi) * * This file is part of VICE, the Versatile Commodore Emulator. * See README for copyright notice. * * This program 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 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. * */ /* XXX: includes? */ #include "vice.h" #include "sound.h" #include <UMS/UMSAudioDevice.h> #include <UMS/UMSBAUDDevice.h> /* XXX: AIX: can these be made static and use aix_ -prefix on these? */ UMSAudioDeviceMClass audio_device_class; UMSAudioDevice_ReturnCode rc; UMSBAUDDevice audio_device; Environment *ev; UMSAudioTypes_Buffer buffer; UMSAudioDeviceMClass_ErrorCode audio_device_class_error; char* error_string; char* audio_formats_alias; char* audio_inputs_alias; char* audio_outputs_alias; char* obyte_order; long out_rate; long left_gain, right_gain; static int aix_init(warn_t *w, char *param, int *speed, int *fragsize, int *fragnr, double bufsize) { int st, tmp, i; /* open device */ ev = somGetGlobalEnvironment(); audio_device = UMSBAUDDeviceNew(); rc = UMSAudioDevice_open(audio_device, ev, "/dev/paud0", "PLAY", UMSAudioDevice_BlockingIO); if (audio_device == NULL) { fprintf(stderr,"can't create audio device object\nError: %s\n", error_string); return 1; } rc = UMSAudioDevice_set_volume(audio_device, ev, 100); rc = UMSAudioDevice_set_balance(audio_device, ev, 0); rc = UMSAudioDevice_set_time_format(audio_device, ev, UMSAudioTypes_Msecs); if (obyte_order) free(obyte_order); rc = UMSAudioDevice_set_byte_order(audio_device, ev, "LSB"); /* set 16bit */ rc = UMSAudioDevice_set_bits_per_sample(audio_device, ev, 16); rc = UMSAudioDevice_set_audio_format_type(audio_device, ev, "PCM"); rc = UMSAudioDevice_set_number_format(audio_device, ev, "TWOS_COMPLEMENT"); /* set speed */ rc = UMSAudioDevice_set_sample_rate(audio_device, ev, *speed, &out_rate); /* channels */ rc = UMSAudioDevice_set_number_of_channels(audio_device, ev, 1); /* should we use the default? */ left_gain = right_gain = 100; rc = UMSAudioDevice_enable_output(audio_device, ev, "LINE_OUT", &left_gain, &right_gain); /* set buffer size */ tmp = (*fragsize)*(*fragnr)*sizeof(SWORD); buffer._maximum = tmp; buffer._buffer = (char *) xmalloc(tmp); buffer._length = 0; rc = UMSAudioDevice_initialize(audio_device, ev); rc = UMSAudioDevice_start(audio_device, ev); return 0; #if 0 /* XXX: AIX: everything should check rc, this isn't used now */ fail: UMSAudioDevice_stop(audio_device, ev); UMSAudioDevice_close(audio_device, ev); _somFree(audio_device); free(buffer._buffer); audio_device = NULL; return 1; #endif } static int aix_write(warn_t *w, SWORD *pbuf, int nr) { int total, i, now; long samples_written; total = nr*sizeof(SWORD); buffer._length = total; memcpy(buffer._buffer,pbuf,total); rc = UMSAudioDevice_write(audio_device, ev, &buffer, total, &samples_written); return 0; } static int aix_bufferstatus(warn_t *w, int first) { int i = -1; rc = UMSAudioDevice_write_buff_remain(audio_device, ev, &i); if (i < 0) return -1; /* fprintf(stderr,"Audio Buffer remains: %d\n blocks",i); */ return i/sizeof(SWORD); } static void aix_close(warn_t *w) { rc = UMSAudioDevice_play_remaining_data(audio_device, ev, TRUE); UMSAudioDevice_stop(audio_device, ev); UMSAudioDevice_close(audio_device, ev); _somFree(audio_device); free(buffer._buffer); audio_device = NULL; } static sound_device_t aix_device = { "aix", aix_init, aix_write, NULL, NULL, aix_bufferstatus, aix_close, NULL, NULL }; int sound_init_aix_device(void) { return sound_register_device(&aix_device); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.