diff --git a/configure b/configure index e633e77aa0..a1373265a4 100755 --- a/configure +++ b/configure @@ -264,6 +264,7 @@ for ac_option do ;; --with-extralibdir=*) _ld_extra=-L`echo $ac_option | cut -d '=' -f 2 | sed 's,:, -L,g'` +# _ld_extra="${_ld_extra} -Wl,-R"`echo $ac_option | cut -d '=' -f 2 | sed 's,:, -Wl\,-R,g'`" -L"`echo $ac_option | cut -d '=' -f 2 | sed 's,:, -L,g'` ;; --enable-runtime-cpudetection) _runtime_cpudetection=yes @@ -1527,11 +1528,28 @@ _sys_soundcard=no cc_check && _sys_soundcard=yes if test "$_sys_soundcard" = yes ; then _def_sys_soundcard='#define HAVE_SYS_SOUNDCARD_H 1' + _inc_soundcard='#include ' else _def_sys_soundcard='#undef HAVE_SYS_SOUNDCARD_H' fi echores "$_sys_soundcard" +if test "$_sys_soundcard" != yes ; then +echocheck "soundcard.h" +cat > $TMPC << EOF +#include +int main(void) { return 0; } +EOF +_soundcard=no +cc_check && _soundcard=yes +if test "$_soundcard" = yes ; then + _def_soundcard='#define HAVE_SOUNDCARD_H 1' + _inc_soundcard='#include ' +else + _def_soundcard='#undef HAVE_SOUNDCARD_H' +fi +echores "$_soundcard" +fi echocheck "sys/dvdio.h" cat > $TMPC << EOF @@ -2434,7 +2452,7 @@ echores "$_mp1e" echocheck "OSS Audio" if test "$_ossaudio" = auto ; then cat > $TMPC << EOF -#include +$_inc_soundcard int main(void) { int arg = SNDCTL_DSP_SETFRAGMENT; return 0; } EOF _ossaudio=no @@ -2448,7 +2466,11 @@ if test "$_ossaudio" = yes ; then _def_ossaudio_devdsp='#define PATH_DEV_DSP "/dev/sound/dsp"' _def_ossaudio_devmixer='#define PATH_DEV_MIXER "/dev/sound/mixer"' else - _def_ossaudio_devdsp='#define PATH_DEV_DSP "/dev/dsp"' + if netbsd || openbsd ; then + _def_ossaudio_devdsp='#define PATH_DEV_DSP "/dev/sound"' + else + _def_ossaudio_devdsp='#define PATH_DEV_DSP "/dev/dsp"' + fi _def_ossaudio_devmixer='#define PATH_DEV_MIXER "/dev/mixer"' fi else @@ -2575,7 +2597,7 @@ echores "$_sgiaudio" echocheck "VCD support" -if linux || bsdos || freebsd || sunos ; then +if linux || bsdos || freebsd || netbsd || sunos ; then _inputmodules="vcd $_inputmodules" _def_vcd='#define HAVE_VCD 1' echores "ok" @@ -3254,7 +3276,11 @@ if test "$_tv_bsdbt848" = auto ; then if test "$_tv" = yes ; then cat > $TMPC < +#ifdef __NetBSD__ +#include +#else #include +#endif int main(void) { return 0; } EOF cc_check && _tv_bsdbt848=yes @@ -3482,6 +3508,7 @@ test "$_xanim" = yes && _ld_dl_dynamic='-rdynamic' _ld_arch="$_ld_arch $_ld_pthread $_ld_dl $_ld_dl_dynamic" bsdos && _ld_arch="$_ld_arch -ldvd" +netbsd && _ld_arch="$_ld_arch -li386 -lossaudio" _def_debug='#undef MP_DEBUG' test "$_debug" && _def_debug='#define MP_DEBUG 1' @@ -3756,6 +3783,10 @@ $_def_rtc /* Define this if your system has the header file for the OSS sound interface */ $_def_sys_soundcard +/* Define this if you system has the header file for the OSS sound interface + * in /usr/include */ +$_def_soundcard + /* Define this if your system uses ftello() for off_t seeking */ $_def_ftello diff --git a/libao2/afmt.h b/libao2/afmt.h index 29f2de1912..1772606554 100644 --- a/libao2/afmt.h +++ b/libao2/afmt.h @@ -3,6 +3,10 @@ #ifdef HAVE_SYS_SOUNDCARD_H #include /* For AFMT_* on linux */ +#else +#ifdef HAVE_SOUNDCARD_H +#include /* OpenBSD have this instead of */ +#endif #endif /* standard, old OSS audio formats */ diff --git a/libao2/ao_oss.c b/libao2/ao_oss.c index 17e6fc4fd5..c7233733a8 100644 --- a/libao2/ao_oss.c +++ b/libao2/ao_oss.c @@ -292,9 +292,11 @@ static int audio_delay_method=2; static float get_delay(){ /* Calculate how many bytes/second is sent out */ if(audio_delay_method==2){ +#ifdef SNDCTL_DSP_GETODELAY int r=0; if(ioctl(audio_fd, SNDCTL_DSP_GETODELAY, &r)!=-1) return ((float)r)/(float)ao_data.bps; +#endif audio_delay_method=1; // fallback if not supported } if(audio_delay_method==1){ diff --git a/libao2/ao_sun.c b/libao2/ao_sun.c index f4d94edb41..16dbf23865 100644 --- a/libao2/ao_sun.c +++ b/libao2/ao_sun.c @@ -440,9 +440,11 @@ static int get_space(){ } #endif +#ifndef __OpenBSD__ ioctl(audio_fd, AUDIO_GETINFO, &info); if (queued_bursts - info.play.eof > 2) return 0; +#endif return ao_data.outburst; } @@ -500,9 +502,13 @@ static int play(void* data,int len,int flags){ static float get_delay(){ audio_info_t info; ioctl(audio_fd, AUDIO_GETINFO, &info); +#ifdef __OpenBSD__ + return (float) info.play.seek/ (float)byte_per_sec ; +#else if (info.play.samples && enable_sample_timing == RTSC_ENABLED) return (float)(queued_samples - info.play.samples) / (float)byte_per_sec; else return (float)((queued_bursts - info.play.eof) * ao_data.outburst) / (float)byte_per_sec; +#endif } diff --git a/libdha/mtrr.c b/libdha/mtrr.c index 271e0b2d73..aec32fcf0e 100644 --- a/libdha/mtrr.c +++ b/libdha/mtrr.c @@ -12,6 +12,12 @@ #include "libdha.h" #include "AsmMacros.h" +#if defined (__i386__) && defined (__NetBSD__) +#include +#include +#include +#include +#endif #if defined( __i386__ ) int mtrr_set_type(unsigned base,unsigned size,int type) @@ -40,6 +46,23 @@ int mtrr_set_type(unsigned base,unsigned size,int type) return wr_len == strlen(sout) ? 0 : EPERM; } return ENOSYS; +#elif defined (__NetBSD__) + struct mtrr *mtrrp; + int n; + + mtrrp = malloc(sizeof (struct mtrr)); + mtrrp->base = base; + mtrrp->len = size; + mtrrp->type = type; + mtrrp->flags = MTRR_VALID | MTRR_PRIVATE; + n = 1; + + if (i386_set_mtrr(mtrrp, &n) < 0) { + free(mtrrp); + return errno; + } + free(mtrrp); + return 0; #else #warning Please port MTRR stuff!!! return ENOSYS; diff --git a/libmpdemux/dvdauth.c b/libmpdemux/dvdauth.c index ead0926357..3266a383e6 100644 --- a/libmpdemux/dvdauth.c +++ b/libmpdemux/dvdauth.c @@ -31,8 +31,11 @@ #include // #include -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) +#if defined(__FreeBSD__) || defined(__NetBSD__) # include +#elif defined(__OpenBSD__) +# include +# define RTLD_NOW RTLD_LAZY #elif defined(__linux__) # include #elif defined(__sun) @@ -169,6 +172,9 @@ static void reset_agids ( DVDHandle dvd ) ioctl(dvd, DVDIOCREPORTKEY, &ai); } #else +#if defined(__OpenBSD__) + union +#endif dvd_authinfo ai; int i; for (i = 0; i < 4; i++) { @@ -219,9 +225,15 @@ int dvd_auth ( char *dev , char *filename ) return 1; } printf("DVD: dlopen OK!\n"); +#ifdef __OpenBSD__ +#define CSS_DLSYM(v,s) if (!(v=dlsym(dlid,"_" s))) {\ +fprintf(stderr,"DVD: %s\n Hint: use libcss version 0.1!\n",dlerror());\ +return 1; } +#else #define CSS_DLSYM(v,s) if (!(v=dlsym(dlid,s))) {\ fprintf(stderr,"DVD: %s\n Hint: use libcss version 0.1!\n",dlerror());\ return 1; } +#endif CSS_DLSYM(dl_CSSisEncrypted,"CSSisEncrypted"); CSS_DLSYM(dl_CSSAuthDisc,"CSSAuthDisc"); diff --git a/libmpdemux/stream.c b/libmpdemux/stream.c index 3cbd2eec48..75bd926213 100644 --- a/libmpdemux/stream.c +++ b/libmpdemux/stream.c @@ -22,6 +22,8 @@ extern int verbose; // defined in mplayer.c #ifdef __FreeBSD__ #include "vcd_read_fbsd.h" +#elif defined(__NetBSD__) +#include "vcd_read_nbsd.h" #else #include "vcd_read.h" #endif diff --git a/libmpdemux/tvi_bsdbt848.c b/libmpdemux/tvi_bsdbt848.c index 6e7e4967f1..b39d3c5e49 100644 --- a/libmpdemux/tvi_bsdbt848.c +++ b/libmpdemux/tvi_bsdbt848.c @@ -39,8 +39,12 @@ #include #include +#ifdef __NetBSD__ +#include +#else #include #include +#endif #ifdef HAVE_SYS_SOUNDCARD_H #include diff --git a/libmpdemux/vcd_read_nbsd.h b/libmpdemux/vcd_read_nbsd.h new file mode 100644 index 0000000000..0166facd08 --- /dev/null +++ b/libmpdemux/vcd_read_nbsd.h @@ -0,0 +1,198 @@ + +#include +#include +#include +#include + +#define CDROM_LEADOUT 0xAA + +static struct ioc_read_toc_entry vcd_entry; +static struct cd_toc_entry vcd_entry_data; +static char vcd_buf[VCD_SECTOR_SIZE]; + +static inline void +vcd_set_msf(unsigned int sect) +{ + unsigned int s = sect; + vcd_entry_data.addr.msf.frame = sect % 75; + sect = sect / 75; + vcd_entry_data.addr.msf.second = sect % 60; + sect = sect / 60; + vcd_entry_data.addr.msf.minute = sect; +} + +static inline unsigned int +vcd_get_msf() +{ + return vcd_entry_data.addr.msf.frame + + (vcd_entry_data.addr.msf.second + + vcd_entry_data.addr.msf.minute * 60) * 75; +} + +int +vcd_seek_to_track(int fd, int track) +{ + vcd_entry.address_format = CD_MSF_FORMAT; + vcd_entry.starting_track = track; + vcd_entry.data_len = sizeof(struct cd_toc_entry); + vcd_entry.data = &vcd_entry_data; + if (ioctl(fd, CDIOREADTOCENTRIES, &vcd_entry)) { + perror("ioctl dif1"); + return -1; + } + return VCD_SECTOR_DATA * vcd_get_msf(); +} + +int +vcd_get_track_end(int fd, int track) +{ + struct ioc_toc_header tochdr; + if (ioctl(fd, CDIOREADTOCHEADER, &tochdr) == -1) { + perror("read CDROM toc header: "); + return -1; + } + vcd_entry.address_format = CD_MSF_FORMAT; + vcd_entry.starting_track = track < tochdr.ending_track ? (track + 1) : CDROM_LEADOUT; + vcd_entry.data_len = sizeof(struct cd_toc_entry); + vcd_entry.data = &vcd_entry_data; + if (ioctl(fd, CDIOREADTOCENTRYS, &vcd_entry)) { + perror("ioctl dif2"); + return -1; + } + return VCD_SECTOR_DATA * vcd_get_msf(); +} + +void +vcd_read_toc(int fd) +{ + struct ioc_toc_header tochdr; + int i; + if (ioctl(fd, CDIOREADTOCHEADER, &tochdr) == -1) { + perror("read CDROM toc header: "); + return; + } + for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) { + struct ioc_read_toc_entry tocentry; + struct cd_toc_entry tocentry_data; + + tocentry.starting_track = i; + tocentry.address_format = CD_MSF_FORMAT; + tocentry.data_len = sizeof(struct cd_toc_entry); + tocentry.data = &tocentry_data; + + if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry) == -1) { + perror("read CDROM toc entry: "); + return; + } + printf("track %02d: adr=%d ctrl=%d format=%d %02d:%02d:%02d\n", + (int) tocentry.starting_track, + (int) tocentry.data->addr_type, + (int) tocentry.data->control, + (int) tocentry.address_format, + (int) tocentry.data->addr.msf.minute, + (int) tocentry.data->addr.msf.second, + (int) tocentry.data->addr.msf.frame + ); + } +} + +static int +vcd_read(int fd, char *mem) +{ + struct scsireq sc; + int lba = vcd_get_msf(); + int blocks; + int sector_type; + int sync, header_code, user_data, edc_ecc, error_field; + int sub_channel; + int rc; + + blocks = 1; + sector_type = 5; /* mode2/form2 */ + sync = 0; + header_code = 0; + user_data = 1; + edc_ecc = 0; + error_field = 0; + sub_channel = 0; + + memset(&sc, 0, sizeof(sc)); + sc.cmd[0] = 0xBE; + sc.cmd[1] = (sector_type) << 2; + sc.cmd[2] = (lba >> 24) & 0xff; + sc.cmd[3] = (lba >> 16) & 0xff; + sc.cmd[4] = (lba >> 8) & 0xff; + sc.cmd[5] = lba & 0xff; + sc.cmd[6] = (blocks >> 16) & 0xff; + sc.cmd[7] = (blocks >> 8) & 0xff; + sc.cmd[8] = blocks & 0xff; + sc.cmd[9] = (sync << 7) | (header_code << 5) | (user_data << 4) | + (edc_ecc << 3) | (error_field << 1); + sc.cmd[10] = sub_channel; + sc.cmdlen = 12; + sc.databuf = (caddr_t) mem; + sc.datalen = 2328; + sc.senselen = sizeof(sc.sense); + sc.flags = SCCMD_READ; + sc.timeout = 10000; + rc = ioctl(fd, SCIOCCOMMAND, &sc); + if (rc == -1) { + perror("SCIOCCOMMAND"); + return -1; + } + if (sc.retsts || sc.error) { + fprintf(stderr, "scsi command failed: status %d error %d\n", sc.retsts, + sc.error); + return -1; + } + return VCD_SECTOR_DATA; +} + +#ifdef VCD_CACHE + +static int vcd_cache_size = 0; +static char *vcd_cache_data = NULL; +static int *vcd_cache_sectors = NULL; +static int vcd_cache_index = 0; +static int vcd_cache_current = -1; + +void +vcd_cache_init(int s) +{ + vcd_cache_size = s; + vcd_cache_sectors = malloc(s * sizeof(int)); + vcd_cache_data = malloc(s * VCD_SECTOR_SIZE); + memset(vcd_cache_sectors, 255, s * sizeof(int)); +} + +static inline void +vcd_cache_seek(int sect) +{ + vcd_cache_current = sect; +} + +int +vcd_cache_read(int fd, char *mem) +{ + int i; + char *vcd_buf; + for (i = 0; i < vcd_cache_size; i++) + if (vcd_cache_sectors[i] == vcd_cache_current) { + vcd_buf = &vcd_cache_data[i * VCD_SECTOR_SIZE]; + ++vcd_cache_current; + memcpy(mem, &vcd_buf[VCD_SECTOR_OFFS], VCD_SECTOR_DATA); + return VCD_SECTOR_DATA; + } + vcd_buf = &vcd_cache_data[vcd_cache_index * VCD_SECTOR_SIZE]; + vcd_cache_sectors[vcd_cache_index] = vcd_cache_current; + ++vcd_cache_index; + if (vcd_cache_index >= vcd_cache_size) + vcd_cache_index = 0; + vcd_set_msf(vcd_cache_current); + memcpy(vcd_buf, &vcd_entry_data.addr.msf, sizeof(vcd_entry_data.addr.msf)); + ++vcd_cache_current; + memcpy(mem, &vcd_buf[VCD_SECTOR_OFFS], VCD_SECTOR_DATA); + return VCD_SECTOR_DATA; +} +#endif + diff --git a/loader/ldt_keeper.c b/loader/ldt_keeper.c index ecb5550d55..8ae013c616 100644 --- a/loader/ldt_keeper.c +++ b/loader/ldt_keeper.c @@ -21,6 +21,7 @@ #include #else #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) +#include #include #endif diff --git a/loader/win32.c b/loader/win32.c index a82346709f..291f111b1f 100644 --- a/loader/win32.c +++ b/loader/win32.c @@ -4096,7 +4096,7 @@ struct libs libraries[]={ LL(msdmo) LL(msvfw32) }; - +#include "mangle.h" static char* called_unk = "Called unk_%s\n"; static void ext_stubs(void) { @@ -4109,9 +4109,9 @@ static void ext_stubs(void) "movl $0, %eax \n\t" "movl $0, %edx \n\t" "shl $5,%eax \n\t" // ax * 32 - "addl $export_names,%eax \n\t" + "addl $"MANGLE(export_names)",%eax \n\t" "pushl %eax \n\t" - "pushl called_unk \n\t" + "pushl "MANGLE(called_unk)" \n\t" "call *%edx \n\t" // printf (via dx) "addl $8,%esp \n\t" "xorl %eax,%eax \n\t" diff --git a/mangle.h b/mangle.h index cd705dc4b3..2701e1affc 100644 --- a/mangle.h +++ b/mangle.h @@ -8,7 +8,7 @@ #define __MANGLE_H /* Feel free to add more to the list, eg. a.out IMO */ -#if defined(__CYGWIN__) || defined(__OS2__) +#if defined(__CYGWIN__) || defined(__OS2__) || defined (__OpenBSD__) #define MANGLE(a) "_" #a #else #define MANGLE(a) #a diff --git a/vidix/vidixlib.c b/vidix/vidixlib.c index 27088c4db1..4fa5cc28ee 100644 --- a/vidix/vidixlib.c +++ b/vidix/vidixlib.c @@ -91,6 +91,13 @@ static int vdl_fill_driver(VDL_HANDLE stream) return 1; } +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL RTLD_LAZY +#endif +#ifndef RTLD_NOW +#define RTLD_NOW RTLD_LAZY +#endif + static int vdl_probe_driver(VDL_HANDLE stream,const char *path,const char *name,unsigned cap,int verbose) { vidix_capability_t vid_cap;