static bool_t set_format(int format, int rate, int channels) { int param; AUDDBG("Audio format: %s, sample rate: %dHz, number of channels: %d.\n", oss_format_to_text(format), rate, channels); /* Enable/disable format conversions made by the OSS software */ param = aud_get_bool("oss4", "cookedmode"); CHECK(ioctl, oss_data->fd, SNDCTL_DSP_COOKEDMODE, ¶m); AUDDBG("%s format conversions made by the OSS software.\n", param ? "Enabled" : "Disabled"); param = format; CHECK_NOISY(ioctl, oss_data->fd, SNDCTL_DSP_SETFMT, ¶m); CHECK_VAL(param == format, ERROR_NOISY, "Selected audio format is not supported by the device.\n"); param = rate; CHECK_NOISY(ioctl, oss_data->fd, SNDCTL_DSP_SPEED, ¶m); CHECK_VAL(param >= rate * 9 / 10 && param <= rate * 11 / 10, ERROR_NOISY, "Selected sample rate is not supported by the device.\n"); param = channels; CHECK_NOISY(ioctl, oss_data->fd, SNDCTL_DSP_CHANNELS, ¶m); CHECK_VAL(param == channels, ERROR_NOISY, "Selected number of channels is not supported by the device.\n"); oss_data->format = format; oss_data->rate = rate; oss_data->channels = channels; oss_data->bits_per_sample = oss_format_to_bits(oss_data->format); return TRUE; FAILED: return FALSE; }
bool_t oss_hardware_present(void) { int mixerfd; oss_sysinfo sysinfo; CHECK_NOISY(mixerfd = open, DEFAULT_MIXER, O_RDWR, 0); CHECK(ioctl, mixerfd, SNDCTL_SYSINFO, &sysinfo); CHECK_NOISY(oss_probe_for_adev, &sysinfo); close(mixerfd); return TRUE; FAILED: close(mixerfd); return FALSE; }
static void combo_init(ComboBoxElements ** elements, int * n_elements) { oss_sysinfo sysinfo; int mixerfd; CHECK_NOISY(mixerfd = open, DEFAULT_MIXER, O_RDWR); CHECK(ioctl, mixerfd, SNDCTL_SYSINFO, &sysinfo); CHECK_NOISY(oss_probe_for_adev, &sysinfo); * elements = (ComboBoxElements *) malloc((sysinfo.numaudios + 1) * sizeof(ComboBoxElements)); * n_elements = 1; ComboBoxElements * tmp = * elements; tmp->label = N_("1. Default device"); tmp->value = DEFAULT_DSP; for (int i = 0; i < sysinfo.numaudios; i++) { oss_audioinfo ainfo; ainfo.dev = i; CHECK(ioctl, mixerfd, SNDCTL_AUDIOINFO, &ainfo); if (ainfo.caps & PCM_CAP_OUTPUT) { tmp++; (* n_elements) ++; SPRINTF(str, "%d. %s", * n_elements, ainfo.name); tmp->label = strdup(str); tmp->value = strdup(ainfo.devnode); } else continue; } FAILED: close(mixerfd); }
int oss_open_audio(int aud_format, int rate, int channels) { AUDDBG("Opening audio.\n"); int format; int vol_left, vol_right; audio_buf_info buf_info; CHECK_NOISY(oss_data->fd = open_device); format = oss_convert_aud_format(aud_format); if (!set_format(format, rate, channels)) goto FAILED; CHECK_NOISY(ioctl, oss_data->fd, SNDCTL_DSP_GETOSPACE, &buf_info); AUDDBG("Buffer information, fragstotal: %d, fragsize: %d, bytes: %d.\n", buf_info.fragstotal, buf_info.fragsize, buf_info.bytes); oss_time = 0; oss_paused = FALSE; oss_paused_time = 0; oss_delay = oss_bytes_to_frames(buf_info.fragstotal * buf_info.fragsize) * 1000 / oss_data->rate; oss_ioctl_vol = TRUE; AUDDBG("Internal OSS buffer size: %dms.\n", oss_delay); if (aud_get_bool("oss4", "save_volume")) { vol_right = (aud_get_int("oss4", "volume") & 0xFF00) >> 8; vol_left = (aud_get_int("oss4", "volume") & 0x00FF); oss_set_volume(vol_left, vol_right); }