Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Transplant missing functions from OpenBSD ports into the netbsd driver.
  • Loading branch information
vext01 committed Jun 19, 2018
1 parent bec8f42 commit 9fb3533
Showing 1 changed file with 148 additions and 3 deletions.
151 changes: 148 additions & 3 deletions lib/driver/netbsd.c
Expand Up @@ -55,6 +55,10 @@
#include "cdio_assert.h"
#include "cdio_private.h"

#ifndef USE_MMC_SUBCHANNEL
#define USE_MMC_SUBCHANNEL 0
#endif

#if defined(__NetBSD__) && (defined(__i386__) || defined(__amd64__))
#define DEFAULT_CDIO_DEVICE "/dev/rcd0d"
#else
Expand Down Expand Up @@ -432,6 +436,41 @@ get_track_isrc_netbsd (const void *p_user_data, track_t i_track) {
return mmc_get_track_isrc( p_env->gen.cdio, i_track );
}

static driver_return_code_t
audio_get_volume_netbsd(void *p_user_data, cdio_audio_volume_t *p_volume)
{
const _img_private_t *p_env = p_user_data;
return (ioctl(p_env->gen.fd, CDIOCGETVOL, p_volume));
}

static driver_return_code_t
audio_pause_netbsd(void *p_user_data)
{
const _img_private_t *p_env = p_user_data;
return (ioctl(p_env->gen.fd, CDIOCPAUSE));
}

static driver_return_code_t
audio_stop_netbsd(void *p_user_data)
{
const _img_private_t *p_env = p_user_data;
return (ioctl(p_env->gen.fd, CDIOCSTOP));
}

static driver_return_code_t
audio_resume_netbsd(void *p_user_data)
{
const _img_private_t *p_env = p_user_data;
return (ioctl(p_env->gen.fd, CDIOCRESUME));
}

static driver_return_code_t
audio_set_volume_netbsd(void *p_user_data, cdio_audio_volume_t *p_volume)
{
const _img_private_t *p_env = p_user_data;
return (ioctl(p_env->gen.fd, CDIOCSETVOL, p_volume));
}

/*!
Get format of track.
*/
Expand Down Expand Up @@ -537,6 +576,23 @@ get_disc_last_lsn_netbsd(void *user_data)

return (((msf.m * 60) + msf.s) * CDIO_CD_FRAMES_PER_SEC + msf.f);
}


static driver_return_code_t
get_last_session_netbsd(void *p_user_data, lsn_t *i_last_session)
{
const _img_private_t *p_env = p_user_data;
int addr;

if (ioctl(p_env->gen.fd, CDIOREADMSADDR, &addr) == 0) {
*i_last_session = addr;
return (DRIVER_OP_SUCCESS);
} else {
cdio_warn("ioctl CDIOREADMSADDR failed: %s\n",
strerror(errno));
return (DRIVER_OP_ERROR);
}
}
#endif /* HAVE_NETBSD_CDROM */

char **
Expand Down Expand Up @@ -577,6 +633,84 @@ cdio_get_devices_netbsd (void)
#endif /* HAVE_NETBSD_CDROM */
}

static driver_return_code_t
audio_play_msf_netbsd(void *p_user_data, msf_t *p_start_msf, msf_t *p_end_msf)
{
const _img_private_t *p_env = p_user_data;
struct ioc_play_msf a;

a.start_m = cdio_from_bcd8(p_start_msf->m);
a.start_s = cdio_from_bcd8(p_start_msf->s);
a.start_f = cdio_from_bcd8(p_start_msf->f);
a.end_m = cdio_from_bcd8(p_end_msf->m);
a.end_s = cdio_from_bcd8(p_end_msf->s);
a.end_f = cdio_from_bcd8(p_end_msf->f);

return (ioctl(p_env->gen.fd, CDIOCPLAYMSF, (char *)&a));
}

#if !USE_MMC_SUBCHANNEL
static driver_return_code_t
audio_read_subchannel_netbsd(void *p_user_data, cdio_subchannel_t *subchannel)
{
const _img_private_t *p_env = p_user_data;
struct ioc_read_subchannel s;
struct cd_sub_channel_info data;

bzero(&s, sizeof(s));
s.data = &data;
s.data_len = sizeof(data);
s.address_format = CD_MSF_FORMAT;
s.data_format = CD_CURRENT_POSITION;

if (ioctl(p_env->gen.fd, CDIOCREADSUBCHANNEL, &s) != -1) {
subchannel->control = s.data->what.position.control;
subchannel->track = s.data->what.position.track_number;
subchannel->index = s.data->what.position.index_number;

subchannel->abs_addr.m =
cdio_to_bcd8(s.data->what.position.absaddr.msf.minute);
subchannel->abs_addr.s =
cdio_to_bcd8(s.data->what.position.absaddr.msf.second);
subchannel->abs_addr.f =
cdio_to_bcd8(s.data->what.position.absaddr.msf.frame);
subchannel->rel_addr.m =
cdio_to_bcd8(s.data->what.position.reladdr.msf.minute);
subchannel->rel_addr.s =
cdio_to_bcd8(s.data->what.position.reladdr.msf.second);
subchannel->rel_addr.f =
cdio_to_bcd8(s.data->what.position.reladdr.msf.frame);
subchannel->audio_status = s.data->header.audio_status;

return (DRIVER_OP_SUCCESS);
} else {
cdio_warn("ioctl CDIOCREADSUBCHANNEL failed: %s\n",
strerror(errno));
return (DRIVER_OP_ERROR);
}
}
#endif

static lba_t
get_track_lba_netbsd(void *p_user_data, track_t i_track)
{
_img_private_t *p_env = p_user_data;

if (!p_env->gen.toc_init)
read_toc_netbsd(p_env);

if (i_track == CDIO_CDROM_LEADOUT_TRACK)
i_track = p_env->gen.i_first_track + p_env->gen.i_tracks;

if (!p_env->gen.toc_init ||
i_track > (p_env->gen.i_first_track + p_env->gen.i_tracks) ||
i_track < p_env->gen.i_first_track)
return (CDIO_INVALID_LBA);

return (p_env->tocent[i_track - p_env->gen.i_first_track].addr.lba +
CDIO_PREGAP_SECTORS);
}

/*!
Return a string containing the default CD device.
*/
Expand Down Expand Up @@ -604,7 +738,18 @@ close_tray_netbsd (const char *psz_device)

#ifdef HAVE_NETBSD_CDROM
static cdio_funcs_t _funcs = {
.audio_get_volume = audio_get_volume_netbsd,
.audio_pause = audio_pause_netbsd,
.audio_play_msf = audio_play_msf_netbsd,
.audio_play_track_index= NULL,
#if USE_MMC_SUBCHANNEL
.audio_read_subchannel = audio_read_subchannel_mmc,
#else
.audio_read_subchannel = audio_read_subchannel_netbsd,
#endif
.audio_stop = audio_stop_netbsd,
.audio_resume = audio_resume_netbsd,
.audio_set_volume = audio_set_volume_netbsd,
.eject_media = eject_media_netbsd,
.free = cdio_generic_free,
.get_arg = get_arg_netbsd,
Expand All @@ -614,6 +759,8 @@ static cdio_funcs_t _funcs = {
.get_default_device = cdio_get_default_device_netbsd,
.get_devices = cdio_get_devices_netbsd,
.get_disc_last_lsn = get_disc_last_lsn_netbsd,
.get_last_session = get_last_session_netbsd,
.get_media_changed = get_media_changed_mmc,
.get_discmode = get_discmode_generic,
.get_drive_cap = get_drive_cap_mmc,
.get_first_track_num = get_first_track_num_netbsd,
Expand All @@ -624,7 +771,7 @@ static cdio_funcs_t _funcs = {
.get_track_copy_permit = get_track_copy_permit_generic,
.get_track_format = get_track_format_netbsd,
.get_track_green = get_track_green_netbsd,
.get_track_lba = NULL, /* This could be implemented if need be. */
.get_track_lba = get_track_lba_netbsd,
.get_track_preemphasis = get_track_preemphasis_generic,
.get_track_msf = get_track_msf_netbsd,
.get_track_isrc = get_track_isrc_netbsd,
Expand All @@ -635,9 +782,7 @@ static cdio_funcs_t _funcs = {
.read_mode2_sector = read_mode2_sector_netbsd,
.read_mode2_sectors = read_mode2_sectors_netbsd,
.read_toc = read_toc_netbsd,
#if 1
.run_mmc_cmd = run_scsi_cmd_netbsd,
#endif
.set_arg = set_arg_netbsd,
};
#endif /*HAVE_NETBSD_CDROM*/
Expand Down

0 comments on commit 9fb3533

Please sign in to comment.