--- BasiliskII/src/Unix/audio_oss_esd.cpp 2001/07/05 20:30:51 1.7 +++ BasiliskII/src/Unix/audio_oss_esd.cpp 2001/07/13 15:39:23 1.10 @@ -60,7 +60,6 @@ static int audio_channel_count_index = 0 // Global variables static int audio_fd = -1; // fd of /dev/dsp or ESD static int mixer_fd = -1; // fd of /dev/mixer -static bool formats_known = false; // Flag: available audio formats have been probed static sem_t audio_irq_done_sem; // Signal from interrupt to streaming thread: data block read static bool sem_inited = false; // Flag: audio_irq_done_sem initialized static int sound_buffer_size; // Size of sound buffer in bytes @@ -100,7 +99,7 @@ static bool open_dsp(void) printf("Using " DSP_NAME " audio output\n"); // Get supported sample formats - if (!formats_known) { + if (audio_sample_sizes.empty()) { unsigned long format; ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &format); if (format & AFMT_U8) @@ -133,7 +132,6 @@ static bool open_dsp(void) audio_sample_rate_index = audio_sample_rates.size() - 1; audio_sample_size_index = audio_sample_sizes.size() - 1; audio_channel_count_index = audio_channel_counts.size() - 1; - formats_known = true; } // Set DSP parameters @@ -144,7 +142,7 @@ static bool open_dsp(void) silence_byte = 0x80; } else { unsigned long sup_format; - ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &format); + ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &sup_format); if (sup_format & AFMT_S16_BE) { little_endian = false; format = AFMT_S16_BE; @@ -172,33 +170,27 @@ static bool open_dsp(void) static bool open_esd(void) { #ifdef ENABLE_ESD - // ESD supports a variety of audio formats - if (!formats_known) { - audio_sample_rates.push_back(11025 << 16); - audio_sample_rates.push_back(22050 << 16); - audio_sample_rates.push_back(44100 << 16); - audio_sample_sizes.push_back(8); - audio_sample_sizes.push_back(16); - audio_channel_counts.push_back(1); - audio_channel_counts.push_back(2); + int rate; + esd_format_t format = ESD_STREAM | ESD_PLAY; - // Default to 44.1kHz, 16-bit, stereo - audio_sample_rate_index = 2; - audio_sample_size_index = 1; - audio_channel_count_index = 1; - formats_known = true; - } + if (audio_sample_sizes.empty()) { - // ESD audio format - esd_format_t format = ESD_STREAM | ESD_PLAY; - if (audio_sample_sizes[audio_sample_size_index] == 8) - format |= ESD_BITS8; - else - format |= ESD_BITS16; - if (audio_channel_counts[audio_channel_count_index] == 1) - format |= ESD_MONO; - else - format |= ESD_STEREO; + // Default values + rate = 44100; + format |= (ESD_BITS16 | ESD_STEREO); + + } else { + + rate = audio_sample_rates[audio_sample_rate_index] >> 16; + if (audio_sample_sizes[audio_sample_size_index] == 8) + format |= ESD_BITS8; + else + format |= ESD_BITS16; + if (audio_channel_counts[audio_channel_count_index] == 1) + format |= ESD_MONO; + else + format |= ESD_STEREO; + } #if WORDS_BIGENDIAN little_endian = false; @@ -208,15 +200,34 @@ static bool open_esd(void) silence_byte = 0; // Is this correct for 8-bit mode? // Open connection to ESD server - audio_fd = esd_play_stream(format, audio_sample_rates[audio_sample_rate_index] >> 16, NULL, NULL); + audio_fd = esd_play_stream(format, rate, NULL, NULL); if (audio_fd < 0) { fprintf(stderr, "WARNING: Cannot open ESD connection\n"); - formats_known = false; return false; } printf("Using ESD audio output\n"); + // ESD supports a variety of twisted little audio formats, all different + if (audio_sample_sizes.empty()) { + + // The reason we do this here is that we don't want to add sample + // rates etc. unless the ESD server connection could be opened + // (if ESD fails, /dev/dsp might be tried next) + audio_sample_rates.push_back(11025 << 16); + audio_sample_rates.push_back(22050 << 16); + audio_sample_rates.push_back(44100 << 16); + audio_sample_sizes.push_back(8); + audio_sample_sizes.push_back(16); + audio_channel_counts.push_back(1); + audio_channel_counts.push_back(2); + + // Default to highest supported values + audio_sample_rate_index = audio_sample_rates.size() - 1; + audio_sample_size_index = audio_sample_sizes.size() - 1; + audio_channel_count_index = audio_channel_counts.size() - 1; + } + // Sound buffer size = 4096 frames audio_frames_per_block = 4096; return true; @@ -273,8 +284,6 @@ dev_opened: void AudioInit(void) { - char str[256]; - // Init audio status (reasonable defaults) and feature flags AudioStatus.sample_rate = 44100 << 16; AudioStatus.sample_size = 16; @@ -329,6 +338,10 @@ static void close_audio(void) void AudioExit(void) { + // Close audio device + close_audio(); + + // Delete semaphore if (sem_inited) { sem_destroy(&audio_irq_done_sem); sem_inited = false; @@ -366,8 +379,6 @@ void audio_exit_stream() * Streaming function */ -static uint32 apple_stream_info; // Mac address of SoundComponentData struct describing next buffer - static void *stream_func(void *arg) { int16 *silent_buffer = new int16[sound_buffer_size / 2];