Skip to content

Commit

Permalink
Transplant missing functions from OpenBSD ports into the NetBSD driver.
Browse files Browse the repository at this point in the history
Some time ago, Jasper Lievisse Adriaanse imported libcdio into OpenBSD
ports including with a dedicated OpenBSD backend.

This change merges his work into the existing NetBSD backend (there were
many missing functions in the NetBSD backend).
  • Loading branch information
vext01 committed Sep 10, 2018
1 parent 0897e98 commit 3826afa
Showing 1 changed file with 148 additions and 3 deletions.
151 changes: 148 additions & 3 deletions lib/driver/netbsd.c
Original file line number Diff line number Diff line change
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 @@ -519,6 +523,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 @@ -624,6 +663,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 @@ -653,6 +709,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 @@ -680,7 +814,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 @@ -690,6 +835,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 @@ -700,7 +847,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 @@ -713,9 +860,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 3826afa

Please sign in to comment.