FreeBSD audio control fixes.

This commit is contained in:
rocky
2005-03-05 23:21:40 +00:00
parent 0ef7ba34cc
commit 4c6890effd

View File

@@ -1,5 +1,5 @@
/* /*
$Id: freebsd.c,v 1.19 2005/03/03 13:48:47 rocky Exp $ $Id: freebsd.c,v 1.20 2005/03/05 23:21:40 rocky Exp $
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: freebsd.c,v 1.19 2005/03/03 13:48:47 rocky Exp $"; static const char _rcsid[] = "$Id: freebsd.c,v 1.20 2005/03/05 23:21:40 rocky Exp $";
#include "freebsd.h" #include "freebsd.h"
@@ -60,7 +60,7 @@ str_to_access_mode_freebsd(const char *psz_access_mode)
} }
static void static void
_free_freebsd (void *p_obj) free_freebsd (void *p_obj)
{ {
_img_private_t *p_env = p_obj; _img_private_t *p_env = p_obj;
@@ -89,7 +89,7 @@ cdio_is_cdrom(char *drive, char *mnttype)
Returns 0 if no error. Returns 0 if no error.
*/ */
static driver_return_code_t static driver_return_code_t
_read_audio_sectors_freebsd (void *p_user_data, void *p_buf, lsn_t i_lsn, read_audio_sectors_freebsd (void *p_user_data, void *p_buf, lsn_t i_lsn,
unsigned int i_blocks) unsigned int i_blocks)
{ {
_img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
@@ -106,8 +106,8 @@ _read_audio_sectors_freebsd (void *p_user_data, void *p_buf, lsn_t i_lsn,
from i_lsn. Returns 0 if no error. from i_lsn. Returns 0 if no error.
*/ */
static driver_return_code_t static driver_return_code_t
_read_mode2_sector_freebsd (void *p_user_data, void *data, lsn_t i_lsn, read_mode2_sector_freebsd (void *p_user_data, void *data, lsn_t i_lsn,
bool b_form2) bool b_form2)
{ {
_img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
@@ -118,28 +118,28 @@ _read_mode2_sector_freebsd (void *p_user_data, void *data, lsn_t i_lsn,
} }
/*! /*!
Reads nblocks of mode2 sectors from cd device into data starting Reads i_blocks of mode2 sectors from cd device into data starting
from lsn. from lsn.
*/ */
static driver_return_code_t static driver_return_code_t
_read_mode2_sectors_freebsd (void *user_data, void *data, lsn_t lsn, read_mode2_sectors_freebsd (void *p_user_data, void *p_data, lsn_t i_lsn,
bool b_form2, unsigned int nblocks) bool b_form2, unsigned int i_blocks)
{ {
_img_private_t *env = user_data; _img_private_t *p_env = p_user_data;
if ( env->access_mode == _AM_CAM && b_form2) { if ( p_env->access_mode == _AM_CAM && b_form2 ) {
/* We have a routine that covers this case without looping. */ /* We have a routine that covers this case without looping. */
return read_mode2_sectors_freebsd_cam(env, data, lsn, nblocks); return read_mode2_sectors_freebsd_cam(p_env, p_data, i_lsn, i_blocks);
} else { } else {
unsigned int i; unsigned int i;
uint16_t i_blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; uint16_t i_blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE;
/* For each frame, pick out the data part we need */ /* For each frame, pick out the data part we need */
for (i = 0; i < nblocks; i++) { for (i = 0; i < i_blocks; i++) {
int retval = _read_mode2_sector_freebsd (env, int retval = read_mode2_sector_freebsd (p_env,
((char *)data) + ((char *)p_data) +
(i_blocksize * i), (i_blocksize * i),
lsn + i, b_form2); i_lsn + i, b_form2);
if (retval) return retval; if (retval) return retval;
} }
} }
@@ -173,7 +173,7 @@ get_disc_last_lsn_freebsd (void *p_obj)
and nonzero if there as an error. and nonzero if there as an error.
*/ */
static driver_return_code_t static driver_return_code_t
_set_arg_freebsd (void *p_user_data, const char key[], const char value[]) set_arg_freebsd (void *p_user_data, const char key[], const char value[])
{ {
_img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
@@ -295,17 +295,27 @@ audio_pause_freebsd (void *p_user_data)
@param p_cdio the CD object to be acted upon. @param p_cdio the CD object to be acted upon.
*/ */
static driver_return_code_t static driver_return_code_t
audio_play_msf_freebsd (void *p_user_data, msf_t *p_msf) audio_play_msf_freebsd (void *p_user_data, msf_t *p_start_msf,
msf_t *p_end_msf)
{ {
const _img_private_t *p_env = p_user_data; const _img_private_t *p_env = p_user_data;
return ioctl(p_env->gen.fd, CDIOCPLAYMSF, p_msf); struct ioc_play_msf freebsd_play_msf;
freebsd_play_msf.start_m = p_start_msf->m;
freebsd_play_msf.start_s = p_start_msf->s;
freebsd_play_msf.start_f = p_start_msf->f;
freebsd_play_msf.end_m = p_end_msf->m;
freebsd_play_msf.end_s = p_end_msf->s;
freebsd_play_msf.end_f = p_end_msf->f;
return ioctl(p_env->gen.fd, CDIOCPLAYMSF, &freebsd_play_msf);
} }
/*! /*!
Playing CD through analog output at the desired track and index Playing CD through analog output at the desired track and index
@param p_cdio the CD object to be acted upon. @param p_user_data the CD object to be acted upon.
@param p_track_index location to start/end. @param p_track_index location to start/end.
*/ */
static driver_return_code_t static driver_return_code_t
@@ -315,12 +325,24 @@ audio_play_track_index_freebsd (void *p_user_data,
const _img_private_t *p_env = p_user_data; const _img_private_t *p_env = p_user_data;
msf_t start_msf; msf_t start_msf;
/* msf_t end_msf; */ msf_t end_msf;
lsn_t i_lsn = get_track_lba_freebsd(p_user_data, p_track_index->i_start_track); struct ioc_play_msf freebsd_play_msf;
/* lsn_t i_end_lsn = cdio_msf_to_lsn(&end_msf); */ lsn_t i_lsn = get_track_lba_freebsd(p_user_data,
p_track_index->i_start_track);
/*get_track_msf_bsdi(p_user_data, p_track_index->i_end_track, &end_msf);*/ cdio_lsn_to_msf(i_lsn, &start_msf);
return ioctl(p_env->gen.fd, CDIOCPLAYMSF, &start_msf); i_lsn = get_track_lba_freebsd(p_user_data, p_track_index->i_end_track);
cdio_lsn_to_msf(i_lsn, &end_msf);
freebsd_play_msf.start_m = start_msf.m;
freebsd_play_msf.start_s = start_msf.s;
freebsd_play_msf.start_f = start_msf.f;
freebsd_play_msf.end_m = end_msf.m;
freebsd_play_msf.end_s = end_msf.s;
freebsd_play_msf.end_f = end_msf.f;
return ioctl(p_env->gen.fd, CDIOCPLAYMSF, &freebsd_play_msf);
} }
@@ -363,9 +385,8 @@ audio_resume_freebsd (void *p_user_data)
*/ */
static driver_return_code_t static driver_return_code_t
audio_set_volume_freebsd (void *p_user_data, audio_set_volume_freebsd (void *p_user_data,
const cdio_audio_volume_t *p_volume) cdio_audio_volume_t *p_volume)
{ {
const _img_private_t *p_env = p_user_data; const _img_private_t *p_env = p_user_data;
return ioctl(p_env->gen.fd, CDIOCSETVOL, p_volume); return ioctl(p_env->gen.fd, CDIOCSETVOL, p_volume);
} }
@@ -374,9 +395,9 @@ audio_set_volume_freebsd (void *p_user_data,
Eject media. Return 1 if successful, 0 otherwise. Eject media. Return 1 if successful, 0 otherwise.
*/ */
static int static int
_eject_media_freebsd (void *user_data) eject_media_freebsd (void *p_user_data)
{ {
_img_private_t *p_env = user_data; _img_private_t *p_env = p_user_data;
return (p_env->access_mode == _AM_IOCTL) return (p_env->access_mode == _AM_IOCTL)
? eject_media_freebsd_ioctl(p_env) ? eject_media_freebsd_ioctl(p_env)
@@ -387,7 +408,7 @@ _eject_media_freebsd (void *user_data)
Return the value associated with the key "arg". Return the value associated with the key "arg".
*/ */
static const char * static const char *
_get_arg_freebsd (void *user_data, const char key[]) get_arg_freebsd (void *user_data, const char key[])
{ {
_img_private_t *env = user_data; _img_private_t *env = user_data;
@@ -416,7 +437,7 @@ _get_arg_freebsd (void *user_data, const char key[])
*/ */
static char * static char *
_get_mcn_freebsd (const void *p_user_data) { get_mcn_freebsd (const void *p_user_data) {
const _img_private_t *p_env = p_user_data; const _img_private_t *p_env = p_user_data;
@@ -474,7 +495,7 @@ run_mmc_cmd_freebsd( void *p_user_data, unsigned int i_timeout_ms,
*/ */
static track_format_t static track_format_t
_get_track_format_freebsd(void *p_user_data, track_t i_track) get_track_format_freebsd(void *p_user_data, track_t i_track)
{ {
_img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
@@ -509,7 +530,7 @@ _get_track_format_freebsd(void *p_user_data, track_t i_track)
FIXME: there's gotta be a better design for this and get_track_format? FIXME: there's gotta be a better design for this and get_track_format?
*/ */
static bool static bool
_get_track_green_freebsd(void *user_data, track_t i_track) get_track_green_freebsd(void *user_data, track_t i_track)
{ {
_img_private_t *p_env = user_data; _img_private_t *p_env = user_data;
@@ -696,9 +717,9 @@ cdio_open_am_freebsd (const char *psz_orig_source_name,
.audio_play_track_index = audio_play_track_index_freebsd, .audio_play_track_index = audio_play_track_index_freebsd,
.audio_resume = audio_resume_freebsd, .audio_resume = audio_resume_freebsd,
.audio_set_volume = audio_set_volume_freebsd, .audio_set_volume = audio_set_volume_freebsd,
.eject_media = _eject_media_freebsd, .eject_media = eject_media_freebsd,
.free = _free_freebsd, .free = free_freebsd,
.get_arg = _get_arg_freebsd, .get_arg = get_arg_freebsd,
.get_blocksize = get_blocksize_mmc, .get_blocksize = get_blocksize_mmc,
.get_cdtext = get_cdtext_generic, .get_cdtext = get_cdtext_generic,
.get_default_device = cdio_get_default_device_freebsd, .get_default_device = cdio_get_default_device_freebsd,
@@ -707,23 +728,23 @@ cdio_open_am_freebsd (const char *psz_orig_source_name,
.get_discmode = get_discmode_generic, .get_discmode = get_discmode_generic,
.get_drive_cap = get_drive_cap_freebsd, .get_drive_cap = get_drive_cap_freebsd,
.get_first_track_num = get_first_track_num_generic, .get_first_track_num = get_first_track_num_generic,
.get_mcn = _get_mcn_freebsd, .get_mcn = get_mcn_freebsd,
.get_num_tracks = get_num_tracks_generic, .get_num_tracks = get_num_tracks_generic,
.get_track_channels = get_track_channels_generic, .get_track_channels = get_track_channels_generic,
.get_track_copy_permit = get_track_copy_permit_generic, .get_track_copy_permit = get_track_copy_permit_generic,
.get_track_format = _get_track_format_freebsd, .get_track_format = get_track_format_freebsd,
.get_track_green = _get_track_green_freebsd, .get_track_green = get_track_green_freebsd,
.get_track_lba = get_track_lba_freebsd, .get_track_lba = get_track_lba_freebsd,
.get_track_preemphasis = get_track_preemphasis_generic, .get_track_preemphasis = get_track_preemphasis_generic,
.get_track_msf = NULL, .get_track_msf = NULL,
.lseek = cdio_generic_lseek, .lseek = cdio_generic_lseek,
.read = cdio_generic_read, .read = cdio_generic_read,
.read_audio_sectors = _read_audio_sectors_freebsd, .read_audio_sectors = read_audio_sectors_freebsd,
.read_mode2_sector = _read_mode2_sector_freebsd, .read_mode2_sector = read_mode2_sector_freebsd,
.read_mode2_sectors = _read_mode2_sectors_freebsd, .read_mode2_sectors = read_mode2_sectors_freebsd,
.read_toc = read_toc_freebsd, .read_toc = read_toc_freebsd,
.run_mmc_cmd = run_mmc_cmd_freebsd, .run_mmc_cmd = run_mmc_cmd_freebsd,
.set_arg = _set_arg_freebsd, .set_arg = set_arg_freebsd,
.set_blocksize = set_blocksize_mmc, .set_blocksize = set_blocksize_mmc,
.set_speed = set_speed_freebsd, .set_speed = set_speed_freebsd,
}; };
@@ -740,10 +761,10 @@ cdio_open_am_freebsd (const char *psz_orig_source_name,
psz_source_name=cdio_get_default_device_freebsd(); psz_source_name=cdio_get_default_device_freebsd();
if (NULL == psz_source_name) return NULL; if (NULL == psz_source_name) return NULL;
_data->device = psz_source_name; _data->device = psz_source_name;
_set_arg_freebsd(_data, "source", psz_source_name); set_arg_freebsd(_data, "source", psz_source_name);
} else { } else {
if (cdio_is_device_generic(psz_orig_source_name)) { if (cdio_is_device_generic(psz_orig_source_name)) {
_set_arg_freebsd(_data, "source", psz_orig_source_name); set_arg_freebsd(_data, "source", psz_orig_source_name);
_data->device = strdup(psz_orig_source_name); _data->device = strdup(psz_orig_source_name);
} else { } else {
/* The below would be okay if all device drivers worked this way. */ /* The below would be okay if all device drivers worked this way. */