Date: Sat, 6 Mar 1999 20:08:46 +0200 (SAT) From: reg@shale.csir.co.za To: FreeBSD-gnats-submit@freebsd.org Subject: ports/10434: New port: gnome-media-1.0.1 Message-ID: <199903061808.UAA96762@shale.csir.co.za>
next in thread | raw e-mail | index | archive | help
>Number: 10434 >Category: ports >Synopsis: New port: gnome-media-1.0.1 >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-ports >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sat Mar 6 10:10:01 PST 1999 >Closed-Date: >Last-Modified: >Originator: Jeremy Lea >Release: FreeBSD 4.0-CURRENT i386 >Organization: Arb's Inc. >Environment: FreeBSD Ports Collection. >Description: This is a port of the GNOME Multimedia package, including gtcd, a CDDB aware CD player, and gmix, a mixer control. I added BSD style ioctl support (in patch-ae), so please report problems to me. >How-To-Repeat: >Fix: # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # . # ./files # ./files/md5 # ./patches # ./patches/patch-aa # ./patches/patch-ab # ./patches/patch-ac # ./patches/patch-ad # ./patches/patch-ae # ./pkg # ./pkg/COMMENT # ./pkg/DESCR # ./pkg/PLIST # ./Makefile # echo c - . mkdir -p . > /dev/null 2>&1 echo c - ./files mkdir -p ./files > /dev/null 2>&1 echo x - ./files/md5 sed 's/^X//' >./files/md5 << 'END-of-./files/md5' XMD5 (gnome-media-1.0.1.tar.gz) = 34c5fa120431aa3ff07b087cbc7cdcdf END-of-./files/md5 echo c - ./patches mkdir -p ./patches > /dev/null 2>&1 echo x - ./patches/patch-aa sed 's/^X//' >./patches/patch-aa << 'END-of-./patches/patch-aa' X--- configure.orig Tue Mar 2 00:30:17 1999 X+++ configure Sat Mar 6 19:22:06 1999 X@@ -4480,7 +4480,7 @@ X cat conftest.$ac_ext >&5 X rm -rf conftest* X CATOBJEXT=.mo X- DATADIRNAME=lib X+ DATADIRNAME=share X fi X rm -f conftest* X INSTOBJEXT=.mo END-of-./patches/patch-aa echo x - ./patches/patch-ab sed 's/^X//' >./patches/patch-ab << 'END-of-./patches/patch-ab' X--- ltconfig.orig Tue Mar 2 00:30:01 1999 X+++ ltconfig Sat Mar 6 18:38:36 1999 X@@ -1225,7 +1225,7 @@ X ;; X X # FreeBSD 3, at last, uses gcc -shared to do shared libraries. X- freebsd3*) X+ freebsd*) X archive_cmds='$CC -shared -o $lib $libobjs $deplibs' X hardcode_libdir_flag_spec='-R$libdir' X hardcode_direct=yes X@@ -1661,7 +1661,7 @@ X shlibpath_var=PATH X ;; X X-freebsd2* | freebsd3*) X+freebsd*) X objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` X version_type=freebsd-$objformat X library_names_spec='${libname}${release}.so$versuffix $libname.so' END-of-./patches/patch-ab echo x - ./patches/patch-ac sed 's/^X//' >./patches/patch-ac << 'END-of-./patches/patch-ac' X--- vu-meter/Makefile.in.orig Wed Mar 3 12:35:57 1999 X+++ vu-meter/Makefile.in Wed Mar 3 12:36:25 1999 X@@ -116,9 +116,9 @@ X ZVT_LIBS = @ZVT_LIBS@ X l = @l@ X X-Audiodir = $(datadir)/gnome/apps/Multimedia X+Audiodir = $(datadir)/apps/Multimedia X X-INCLUDES = -DGNOMELOCALEDIR=\""$(datadir)/locale"\" $(GNOME_INCLUDEDIR) X+INCLUDES = -DGNOMELOCALEDIR=\""$(prefix)/share/locale"\" $(GNOME_INCLUDEDIR) X X X bin_PROGRAMS = vumeter X--- gmix/Makefile.in.orig Sat Feb 27 09:22:00 1999 X+++ gmix/Makefile.in Wed Mar 3 12:37:46 1999 X@@ -116,11 +116,11 @@ X ZVT_LIBS = @ZVT_LIBS@ X l = @l@ X X-Audiodir = $(datadir)/gnome/apps/Multimedia X+Audiodir = $(datadir)/apps/Multimedia X X EXTRA_DIST = README TODO NEWS gmix.desktop X X-INCLUDES = -DGNOMELOCALEDIR=\""$(datadir)/locale"\" $(GNOME_INCLUDEDIR) X+INCLUDES = -DGNOMELOCALEDIR=\""$(prefix)/share/locale"\" $(GNOME_INCLUDEDIR) X X X bin_PROGRAMS = gmix X--- tcd/Makefile.in.orig Sat Feb 27 09:22:02 1999 X+++ tcd/Makefile.in Wed Mar 3 12:38:28 1999 X@@ -116,7 +116,7 @@ X ZVT_LIBS = @ZVT_LIBS@ X l = @l@ X X-Audiodir = $(datadir)/gnome/apps/Multimedia X+Audiodir = $(datadir)/apps/Multimedia X X EXTRA_DIST = README TODO NEWS gtcd.desktop X X@@ -141,7 +141,7 @@ X X CLEANFILES = *~ X X-INCLUDES = -I$(includedir) $(GNOME_INCLUDEDIR) $(CURSES_INCLUDEDIR) -DGNOMELOCALEDIR=\""$(datadir)/locale"\" $(USE_CD_CHANGER) -g X+INCLUDES = -I$(includedir) $(GNOME_INCLUDEDIR) $(CURSES_INCLUDEDIR) -DGNOMELOCALEDIR=\""$(prefix)/share/locale"\" $(USE_CD_CHANGER) -g X X X Audio_DATA = gtcd.desktop END-of-./patches/patch-ac echo x - ./patches/patch-ad sed 's/^X//' >./patches/patch-ad << 'END-of-./patches/patch-ad' X--- gmix/gmix.c.orig Fri Feb 19 18:30:49 1999 X+++ gmix/gmix.c Wed Mar 3 10:49:51 1999 X@@ -94,6 +94,17 @@ X /* X * All, that is known about a mixer-device X */ X+ X+#if !defined(OPEN_SOUND_SYSTEM) X+typedef struct mixer_info X+{ X+ char id[16]; X+ char name[32]; X+ int modify_counter; X+ int fillers[10]; X+} mixer_info; X+#endif X+ X typedef struct device_info { X int fd; X mixer_info info; X@@ -272,11 +283,7 @@ X /* X * open the mixer-device X */ X- if (num==0) { X- sprintf(device_name, "/dev/mixer"); X- } else { X- sprintf(device_name, "/dev/mixer%i", num); X- } X+ sprintf(device_name, "/dev/mixer%i", num); X new_device->fd=open(device_name, O_RDWR, 0); X if (new_device->fd<0) { X free(new_device); X@@ -291,6 +298,8 @@ X fprintf(stderr, "Warning: This version of gmix was compiled with a different version of\nsoundcard.h.\n"); X } X #endif X+ X+#if defined(OPEN_SOUND_SYSTEM) X /* X * mixer-name X */ X@@ -301,6 +310,11 @@ X } X if(!isalpha(new_device->info.name[0])) X g_snprintf(new_device->info.name, 31, "Card %d", num+1); X+#else X+ g_snprintf(new_device->info.id, 15, "mixer%d", num); X+ g_snprintf(new_device->info.name, 31, "Sound Card %d", num+1); X+ new_device->info.modify_counter=0; X+#endif X /* X * several bitmasks describing the mixer X */ X@@ -386,15 +400,15 @@ X { X int cnt; X device_info *new_device; X- cnt=0; devices=NULL; X+ cnt=0; num_mixers=0; devices=NULL; X do { X new_device=open_device(cnt++); X if (new_device) { X new_device->channels=make_channels(new_device); X devices=g_list_append(devices, new_device); X+ num_mixers++; X } X- } while (new_device); X- num_mixers=cnt-1; X+ } while ((errno == EACCES) || (errno == EINVAL) || new_device); X } X X void free_one_device(gpointer a, gpointer b) END-of-./patches/patch-ad echo x - ./patches/patch-ae sed 's/^X//' >./patches/patch-ae << 'END-of-./patches/patch-ae' X--- tcd/callbacks.c.orig Sun Feb 21 20:32:04 1999 X+++ tcd/callbacks.c Wed Mar 3 10:57:00 1999 X@@ -10,7 +10,7 @@ X X void play_cb(GtkWidget *widget, gpointer data) X { X- if(cd.sc.cdsc_audiostatus==CDROM_AUDIO_PAUSED) X+ if(SC_AUDIOSTATUS(cd.sc)==CDROM_AUDIO_PAUSED) X tcd_pausecd(&cd); X else X tcd_playtracks(&cd, cd.first_t, cd.last_t, prefs.only_use_trkind); X@@ -42,7 +42,7 @@ X cd.play_method = NORMAL; X cd.repeat_track = -1; X /* SDH: Make sure play/pause state change is noticed */ X- cd.sc.cdsc_audiostatus = -1; X+ SC_AUDIOSTATUS(cd.sc) = -1; X if(cd.isplayable) X { X make_goto_menu(); X--- tcd/cddb.c.orig Sat Feb 20 23:08:10 1999 X+++ tcd/cddb.c Wed Mar 3 10:57:00 1999 X@@ -120,16 +120,16 @@ X { X int min, sec; X X- min = cd->trk[i].toc.cdte_addr.msf.minute; X- sec = cd->trk[i].toc.cdte_addr.msf.second; X+ min = TOC_MINUTE(cd->trk[i]); X+ sec = TOC_MINUTE(cd->trk[i]); X X n = (min*60)+sec; X- fprintf( fp, "# %u\n", (n*75)+cd->trk[i].toc.cdte_addr.msf.frame ); X+ fprintf( fp, "# %u\n", (n*75)+TOC_FRAME(cd->trk[i]) ); X } X /* Print the number of seconds */ X fprintf( fp, "#\n# Disc length: %i seconds\n", X- (cd->trk[cd->last_t+1].toc.cdte_addr.msf.minute*60) X- +(cd->trk[cd->last_t+1].toc.cdte_addr.msf.second) ); X+ (TOC_MINUTE(cd->trk[cd->last_t+1])*60) X+ +(TOC_SECOND(cd->trk[cd->last_t+1])) ); X X /* FIXME increment revision. sigh, lousy cddb */ X fprintf( fp, "#\n# Revision: 0\n" ); X@@ -160,10 +160,10 @@ X { X int min, sec; X X- min = cd->trk[i].toc.cdte_addr.msf.minute; X- sec = cd->trk[i].toc.cdte_addr.msf.second; X+ min = TOC_MINUTE(cd->trk[i]); X+ sec = TOC_SECOND(cd->trk[i]); X X- l=sprintf( tmp, "%u ", calc_offset(min,sec,cd->trk[i].toc.cdte_addr.msf.frame)); X+ l=sprintf( tmp, "%u ", calc_offset(min,sec,TOC_FRAME(cd->trk[i]))); X X if(blen>l) X { X@@ -172,8 +172,8 @@ X } X } X l=sprintf( tmp, "%i\n", X- (cd->trk[cd->last_t+1].toc.cdte_addr.msf.minute*60) X- +(cd->trk[cd->last_t+1].toc.cdte_addr.msf.second) ); X+ (TOC_MINUTE(cd->trk[cd->last_t+1])*60) X+ +(TOC_SECOND(cd->trk[cd->last_t+1])) ); X if(blen>l) X strcat( buf,tmp ); X X@@ -203,9 +203,9 @@ X X for( i=0; i <= cd->last_t+1; i++ ) X { X- cdtoc[i].frame = cd->trk[i+1].toc.cdte_addr.msf.frame; X- cdtoc[i].min = cd->trk[i+1].toc.cdte_addr.msf.minute; X- cdtoc[i].sec = cd->trk[i+1].toc.cdte_addr.msf.second; X+ cdtoc[i].frame = TOC_FRAME(cd->trk[i+1]); X+ cdtoc[i].min = TOC_MINUTE(cd->trk[i+1]); X+ cdtoc[i].sec = TOC_SECOND(cd->trk[i+1]); X } X X X--- tcd/gtcd.c.orig Wed Feb 24 02:48:49 1999 X+++ tcd/gtcd.c Wed Mar 3 10:57:00 1999 X@@ -408,8 +408,8 @@ X break; X case DISC_R: X cur = cd.cur_pos_abs; X- end = (cd.trk[cd.last_t+1].toc.cdte_addr.msf.minute X- *60)+cd.trk[cd.last_t+1].toc.cdte_addr.msf.second; X+ end = (TOC_MINUTE(cd.trk[cd.last_t+1])*60 X+ +TOC_SECOND(cd.trk[cd.last_t+1])); X pos = end-cur; X min = pos/60; X sec = pos-(pos/60)*60; X@@ -490,7 +490,7 @@ X X if( !cd.err ) X { X- switch( cd.sc.cdsc_audiostatus ) X+ switch( SC_AUDIOSTATUS(cd.sc) ) X { X case CDROM_AUDIO_INVALID: X strcpy(tmp, _("No Disc")); X@@ -577,8 +577,8 @@ X } X X /* see if we need to repeat */ X- if( cd.sc.cdsc_audiostatus != CDROM_AUDIO_PLAY && X- cd.sc.cdsc_audiostatus != CDROM_AUDIO_PAUSED ) X+ if( SC_AUDIOSTATUS(cd.sc) != CDROM_AUDIO_PLAY && X+ SC_AUDIOSTATUS(cd.sc) != CDROM_AUDIO_PAUSED ) X { X if( cd.play_method == REPEAT_CD ) X tcd_playtracks( &cd, cd.first_t, cd.last_t, prefs.only_use_trkind); X@@ -593,14 +593,14 @@ X X void status_changed(void) X { X- if(old_status != cd.sc.cdsc_audiostatus) X+ if(old_status != SC_AUDIOSTATUS(cd.sc)) X { X GtkWidget *pixmap; X GtkSignalFunc func; X char tmp[256]; X char *name; X X- old_status = cd.sc.cdsc_audiostatus; X+ old_status = SC_AUDIOSTATUS(cd.sc); X g_snprintf(tmp, 255, "tcd/%s.xpm", X (old_status==CDROM_AUDIO_PLAY)?"pause":"play"); X X--- tcd/gtracked.c.orig Thu Feb 11 18:48:56 1999 X+++ tcd/gtracked.c Wed Mar 3 10:57:00 1999 X@@ -166,8 +166,8 @@ X /* Disc area */ X disc_table = gtk_table_new(2, 2, FALSE); X g_snprintf(tmp, 63, _("Disc Information (%02u:%02u minutes)"), X- cd.trk[cd.last_t+1].toc.cdte_addr.msf.minute, X- cd.trk[cd.last_t+1].toc.cdte_addr.msf.second); X+ TOC_MINUTE(cd.trk[cd.last_t+1]), X+ TOC_SECOND(cd.trk[cd.last_t+1])); X X disc_frame = gtk_frame_new(tmp); X label = gtk_label_new(_("Artist / Title")); X--- tcd/linux-cdrom.c.orig Tue Feb 23 06:52:46 1999 X+++ tcd/linux-cdrom.c Wed Mar 3 10:57:00 1999 X@@ -77,7 +77,7 @@ X if(!homedir) X homedir = "/"; X X-#if defined(TCD_CHANGER_ENABLED) X+#if defined(TCD_CHANGER_ENABLED) && !defined(TCD_BSD) X cd->nslots = ioctl( cd->cd_dev, CDROM_CHANGER_NSLOTS ); X #else X cd->nslots = 0; X@@ -120,34 +120,58 @@ X X int tcd_readtoc( cd_struct *cd ) X { X- int tmp,i; X+ int i; X int delsecs; X+#ifdef TCD_BSD X+ struct ioc_read_toc_single_entry tocentry; X+#endif X X debug("cdrom.c: tcd_readtoc(%p) top\n", cd ); X cd->err = FALSE; X cd->isplayable=FALSE; X X /* read the TOC header */ X+#ifdef TCD_BSD X+ if(ioctl( cd->cd_dev, CDIOREADTOCHEADER, &cd->tochdr)) X+#else X if(ioctl( cd->cd_dev, CDROMREADTOCHDR, &cd->tochdr)) X+#endif X { X strcpy( cd->errmsg, "Can't read disc." ); X cd->err = TRUE; X debug("cdrom.c: tcd_readtoc exiting prematurly. CDROMREADTOCHDR ioctl error.\n" ); X cd->cur_t = 0; X cd->cddb_id = 0; X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X return(-1); X } X X /* grab first & last tracks */ X+#ifdef TCD_BSD X+ cd->first_t = cd->tochdr.starting_track; X+ cd->last_t = cd->tochdr.ending_track; X+#else X cd->first_t = cd->tochdr.cdth_trk0; X cd->last_t = cd->tochdr.cdth_trk1; X+#endif X X /* read the leadout track */ X+#ifdef TCD_BSD X+ tocentry.track = cd->last_t+1; /* Magic last track */ X+ tocentry.address_format = CD_MSF_FORMAT; X+#else X cd->trk[C(cd->last_t+1)].toc.cdte_track = CDROM_LEADOUT; X cd->trk[C(cd->last_t+1)].toc.cdte_format = CDROM_MSF; X+#endif X X /* read the leadout toc */ X+#ifdef TCD_BSD X+ if(ioctl(cd->cd_dev, CDIOREADTOCENTRY, &tocentry)) X+#else X if(ioctl(cd->cd_dev, CDROMREADTOCENTRY, &cd->trk[C(cd->last_t+1)].toc)) X+#endif X { X strcpy(cd->errmsg, "Can't read disc."); X cd->err = TRUE; X@@ -155,40 +179,65 @@ X debug("cdrom.c: tcd_readtoc exiting prematurly. CDROMREADTOCENTRY ioctl error.\n" ); X cd->cur_t = 0; X cd->cddb_id = 0; X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X return(-1); X } X+#ifdef TCD_BSD X+ cd->trk[C(cd->last_t+1)].toc = tocentry.entry; X+#endif X+ cd->trk[C(cd->last_t+1)].length = TOC_MINUTE(cd->trk[C(cd->last_t+1)]) * 60 + X+ TOC_SECOND(cd->trk[C(cd->last_t+1)]); X+ cd->trk[C(cd->last_t+1)].start = cd->trk[C(cd->last_t+1)].length * 75 + X+ TOC_FRAME(cd->trk[C(cd->last_t+1)]); X X /* read the rest of the tocs */ X for( i = cd->first_t; i <= cd->last_t; i++ ) X { X+#ifdef TCD_BSD X+ tocentry.track = i; X+ tocentry.address_format = CD_MSF_FORMAT; X+#else X cd->trk[C(i)].toc.cdte_track = i; X cd->trk[C(i)].toc.cdte_format = CDROM_MSF; X+#endif X X+#ifdef TCD_BSD X+ if(ioctl(cd->cd_dev, CDIOREADTOCENTRY, &tocentry)) X+#else X if(ioctl(cd->cd_dev, CDROMREADTOCENTRY, &cd->trk[C(i)].toc)) X+#endif X { X strcpy( cd->errmsg, "Can't read disc." ); X cd->err = TRUE; X debug("cdrom.c: tcd_readtoc exiting prematurly. CDROMREADTOCENTRY ioctl error.\n" ); X cd->cur_t = 0; X cd->cddb_id = 0; X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X return(-1); X } X X+#ifdef TCD_BSD X+ cd->trk[C(i)].toc = tocentry.entry; X+ cd->trk[C(i)].type = cd->trk[C(i)].toc.control; X+#else X cd->trk[C(i)].type = cd->trk[C(i)].toc.cdte_ctrl; X- cd->trk[C(i)].length = cd->trk[C(i)].toc.cdte_addr.msf.minute * 60 + X- cd->trk[C(i)].toc.cdte_addr.msf.second; X+#endif X+ cd->trk[C(i)].length = TOC_MINUTE(cd->trk[C(i)]) * 60 + X+ TOC_SECOND(cd->trk[C(i)]); X cd->trk[C(i)].start = cd->trk[C(i)].length * 75 + X- cd->trk[C(i)].toc.cdte_addr.msf.frame; X+ TOC_FRAME(cd->trk[C(i)]); X } X X /* calculate track times */ X for(i = cd->first_t; i <= cd->last_t; i ++) X { X /* Taken from cdtool...Thanks Thomas I.! */ X- delsecs = cd->trk[C(i+1)].toc.cdte_addr.msf.minute * 60 X- + cd->trk[C(i+1)].toc.cdte_addr.msf.second X- - cd->trk[C(i)].toc.cdte_addr.msf.minute * 60 X- - cd->trk[C(i)].toc.cdte_addr.msf.second; X+ delsecs = cd->trk[C(i+1)].length X+ - cd->trk[C(i)].length; X X cd->trk[C(i)].tot_min = delsecs / 60; X cd->trk[C(i)].tot_sec = delsecs - (delsecs/60)*60; X@@ -207,7 +256,7 @@ X X cd->isplayable=TRUE; X debug("cdrom.c: tcd_readtoc exiting normally\n" ); X- return tmp; X+ return 0; X } X X void tcd_recalculate(cd_struct *cd) X@@ -215,9 +264,8 @@ X int result; X X /* calculate various timing values */ X- cd->cur_pos_abs = cd->sc.cdsc_absaddr.msf.minute * 60 + X- cd->sc.cdsc_absaddr.msf.second; X- cd->cur_frame = cd->cur_pos_abs * 75 + cd->sc.cdsc_absaddr.msf.frame; X+ cd->cur_pos_abs = SC_MINUTE(cd->sc) * 60 + SC_SECOND(cd->sc); X+ cd->cur_frame = cd->cur_pos_abs * 75 + SC_FRAME(cd->sc); X X cd->cur_pos_rel = (cd->cur_frame - cd->trk[C(cd->cur_t)].start) / 75; X X@@ -235,42 +283,83 @@ X cd->cd_sec = cd->cur_pos_abs % 60; X cd->cd_min = cd->cur_pos_abs / 60; X X-#ifdef TCD_CHANGER_ENABLED X+#if defined(TCD_CHANGER_ENABLED) & !defined(TCD_BSD) X cd->cur_disc = ioctl( cd->cd_dev, CDROM_SELECT_DISC, CDSL_CURRENT ); X #endif X } X X void tcd_gettime( cd_struct *cd ) X { X+#ifdef TCD_BSD X+ struct ioc_read_subchannel subch; X+#endif X+ X cd->err = FALSE; X+#ifdef TCD_BSD X+ subch.address_format = CD_MSF_FORMAT; X+ subch.data_format = CD_CURRENT_POSITION; X+ subch.data_len = sizeof(cd->sc); X+ subch.data = &(cd->sc); X+#else X cd->sc.cdsc_format = CDROM_MSF; X+#endif X X if(cd->isplayable) X { X+#ifdef TCD_BSD X+ if(ioctl( cd->cd_dev, CDIOCREADSUBCHANNEL, &subch)) X+#else X if(ioctl( cd->cd_dev, CDROMSUBCHNL, &cd->sc)) X+#endif X { X strcpy( cd->errmsg, "Can't read disc." ); X cd->err = TRUE; X debug("cdrom.c: tcd_gettime exiting early. CDROMSUBCHNL ioctl error.\n" ); X cd->cur_t = 0; X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X return; X } X- if(cd->sc.cdsc_audiostatus==CDROM_AUDIO_PLAY) X- cd->cur_t = cd->sc.cdsc_trk; X+ if( SC_AUDIOSTATUS(cd->sc)==CDROM_AUDIO_PLAY ) X+ { X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCPREVENT); X+#endif X+ cd->cur_t = SC_TRACK(cd->sc); X+ } X else X- cd->cur_t = 0; X+ { X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X+ cd->cur_t = 0; X+ } X tcd_recalculate(cd); X } X } X X int tcd_set_volume(cd_struct *cd, int volume) X { X+#ifdef TCD_BSD X+ struct ioc_vol vol; X+#else X struct cdrom_volctrl vol; X+#endif X X+#ifdef TCD_BSD X+ vol.vol[0] = volume; X+ vol.vol[1] = vol.vol[2] = vol.vol[3] = vol.vol[0]; X+#else X vol.channel0 = volume; X vol.channel1 = vol.channel2 = vol.channel3 = vol.channel0; X+#endif X X+#ifdef TCD_BSD X+ if(ioctl(cd->cd_dev, CDIOCSETVOL, &vol) < 0) X+#else X if(ioctl(cd->cd_dev, CDROMVOLCTRL, &vol) < 0) X+#endif X return FALSE; X X return TRUE; X@@ -278,6 +367,14 @@ X X int tcd_get_volume(cd_struct *cd) X { X+#ifdef TCD_BSD X+ struct ioc_vol vol; X+ X+ if(ioctl(cd->cd_dev, CDIOCGETVOL, &vol) < 0) X+ return -1; X+ X+ return vol.vol[0]; X+#else X #ifdef CDROMVOLREAD X struct cdrom_volctrl vol; X X@@ -287,13 +384,40 @@ X return vol.channel0; X #else X return 0; X+#endif X #endif X } X X int tcd_playtracks(cd_struct *cd, int start_t, int end_t, int only_use_trkind) X { X+#ifdef TCD_BSD X+ struct ioc_play_msf msf; X+#define MSF_START_MIN (msf.start_m) X+#define MSF_START_SEC (msf.start_s) X+#define MSF_START_FRM (msf.start_f) X+#define MSF_END_MIN (msf.end_m) X+#define MSF_END_SEC (msf.end_s) X+#define MSF_END_FRM (msf.end_f) X+ struct ioc_play_track trkind; X+#define TI_START_TRK (trkind.start_track) X+#define TI_START_IND (trkind.start_index) X+#define TI_END_TRK (trkind.end_track) X+#define TI_END_IND (trkind.end_index) X+#else X struct cdrom_msf msf; X+#define MSF_START_MIN (msf.cdmsf_min0) X+#define MSF_START_SEC (msf.cdmsf_sec0) X+#define MSF_START_FRM (msf.cdmsf_frame0) X+#define MSF_END_MIN (msf.cdmsf_min1) X+#define MSF_END_SEC (msf.cdmsf_sec1) X+#define MSF_END_FRM (msf.cdmsf_frame0) X struct cdrom_ti trkind; X+#define TI_START_TRK (trkind.cdti_trk0) X+#define TI_START_IND (trkind.cdti_ind0) X+#define TI_END_TRK (trkind.cdti_trk1) X+#define TI_END_IND (trkind.cdti_ind1) X+#endif X+ X int tmp; X debug("cdrom.c: tcd_playtracks( %p, %d, %d )\n", cd, start_t, end_t ); X cd->err = FALSE; X@@ -302,7 +426,7 @@ X tcd_gettime(cd); X if(cd->err) X { X- /* try and inject cd */ X+ /* try and eject cd */ X tcd_ejectcd(cd); X X if(cd->err) X@@ -312,64 +436,88 @@ X } X } X X+#ifdef TCD_BSD X+ ioctl(cd->cd_dev, CDIOCCLOSE); X+#else X #if defined(CDROMCLOSETRAY) X ioctl(cd->cd_dev, CDROMCLOSETRAY); X-#endif X- X- if(cd->trk[start_t].toc.cdte_ctrl == CDROM_DATA_TRACK) X- start_t++; /* bad hack. most data tracks are the first track... */ X+#endif X+#endif X X- msf.cdmsf_min0 = cd->trk[start_t].toc.cdte_addr.msf.minute; X- msf.cdmsf_sec0 = cd->trk[start_t].toc.cdte_addr.msf.second; X- msf.cdmsf_frame0 = cd->trk[start_t].toc.cdte_addr.msf.frame; X+ /* bad hack. most data tracks are the first track... */ X+#ifdef TCD_BSD X+ if(cd->trk[start_t].toc.control == 0x04) X+#else X+ if(cd->trk[start_t].toc.cdte_ctrl == CDROM_DATA_TRACK) X+#endif X+ start_t++; X+ X+ MSF_START_MIN = TOC_MINUTE(cd->trk[start_t]); X+ MSF_START_SEC = TOC_SECOND(cd->trk[start_t]); X+ MSF_START_FRM = TOC_FRAME(cd->trk[start_t]); X X if( end_t < 0 ) X { X- msf.cdmsf_min1 = cd->trk[start_t].tot_min+msf.cdmsf_min0; X- msf.cdmsf_sec1 = cd->trk[start_t].tot_sec+msf.cdmsf_sec0; X- msf.cdmsf_frame1=0; X+ MSF_END_MIN = cd->trk[start_t].tot_min+MSF_START_MIN; X+ MSF_END_SEC = cd->trk[start_t].tot_sec+MSF_START_SEC; X+ MSF_END_FRM = 0; X } X else X { X- msf.cdmsf_min1 = cd->trk[end_t+1].toc.cdte_addr.msf.minute; X- msf.cdmsf_sec1 = cd->trk[end_t+1].toc.cdte_addr.msf.second; X- msf.cdmsf_frame1 = cd->trk[end_t+1].toc.cdte_addr.msf.frame - 1; X+ MSF_END_MIN = TOC_MINUTE(cd->trk[end_t+1]); X+ MSF_END_SEC = TOC_SECOND(cd->trk[end_t+1]); X+ MSF_END_FRM = TOC_FRAME(cd->trk[end_t+1]) - 1; X X #ifdef UNSIGNED_NUMBERS_CAN_BE_NEGATIVE X- if(msf.cdmsf_frame1 < 0) X+ if(MSF_END_FRM < 0) X { X- msf.cdmsf_sec1 += msf.cdmsf_frame1; X- msf.cdmsf_frame1 = 0; X+ MSF_END_SEC += MSF_END_FRM; X+ MSF_END_FRM = 0; X } X- if(msf.cdmsf_sec1 < 0) X+ if(MSF_END_SEC < 0) X { X- msf.cdmsf_min1 += msf.cdmsf_sec1; X- msf.cdmsf_sec1 = 0; X+ MSF_END_MIN += MSF_END_SEC; X+ MSF_END_SEC = 0; X } X- if(msf.cdmsf_min1 < 0) X+ if(MSF_END_MIN < 0) X { X- msf.cdmsf_min1 = 0; X+ MSF_END_MIN = 0; X } X #endif X } X- msf.cdmsf_min1 += (msf.cdmsf_sec1 / 60); X- msf.cdmsf_sec1 %= 60; X+ MSF_END_MIN += (MSF_END_SEC / 60); X+ MSF_END_SEC %= 60; X X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCPREVENT); X+#endif X+ X+#ifdef TCD_BSD X+ if(only_use_trkind || ioctl( cd->cd_dev, CDIOCPLAYMSF, &msf)) X+#else X if(ioctl( cd->cd_dev, CDROMPLAYMSF, &msf) || only_use_trkind) X+#endif X { X debug("cdrom.c: tcd_playtracks error. CDROMPLAYMSF ioctl error (or user override). Trying PLAYTRKIND\n" ); X X /* Try alternate method of playing */ X- trkind.cdti_trk0 = start_t; /* start track */ X- trkind.cdti_ind0 = 0; /* start index */ X- trkind.cdti_trk1 = end_t; /* end track */ X- trkind.cdti_ind1 = 0; /* end index */ X+ TI_START_TRK = start_t; /* start track */ X+ TI_START_IND = 0; /* start index */ X+ TI_END_TRK = end_t; /* end track */ X+ TI_END_IND = 0; /* end index */ X X+#ifdef TCD_BSD X+ if(ioctl(cd->cd_dev, CDIOCPLAYTRACKS, &trkind)) X+#else X if(ioctl(cd->cd_dev, CDROMPLAYTRKIND, &trkind)) X+#endif X { X strcpy( cd->errmsg, "Error playing disc" ); X cd->err = TRUE; X debug("cdrom.c: tcd_playtracks error. CDROMPLAYTRKIND ioctl error.\n"); X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X return -1; X } X } X@@ -381,7 +529,11 @@ X X int tcd_play_seconds( cd_struct *cd, long int offset ) X { X+#ifdef TCD_BSD X+ struct ioc_play_msf msf; X+#else X struct cdrom_msf msf; X+#endif X int tmp; X X debug("cdrom.c: tcd_playseconds( %p, %ld )\n", cd, offset ); X@@ -390,42 +542,53 @@ X cd->isplayable=FALSE; X X /* got subchannel? */ X- msf.cdmsf_sec0 = cd->sc.cdsc_absaddr.msf.second+offset; X- msf.cdmsf_min0 = cd->sc.cdsc_absaddr.msf.minute; X- msf.cdmsf_frame0 = cd->sc.cdsc_absaddr.msf.frame; X- msf.cdmsf_min1 = cd->trk[C(cd->last_t+1)].toc.cdte_addr.msf.minute; X- msf.cdmsf_sec1 = cd->trk[C(cd->last_t+1)].toc.cdte_addr.msf.second; X- msf.cdmsf_frame1 = cd->trk[C(cd->last_t+1)].toc.cdte_addr.msf.frame - 1; X+ MSF_START_SEC = SC_SECOND(cd->sc)+offset; X+ MSF_START_MIN = SC_MINUTE(cd->sc); X+ MSF_START_FRM = SC_FRAME(cd->sc); X+ MSF_END_MIN = TOC_MINUTE(cd->trk[C(cd->last_t+1)]); X+ MSF_END_SEC = TOC_SECOND(cd->trk[C(cd->last_t+1)]); X+ MSF_END_FRM = TOC_FRAME(cd->trk[C(cd->last_t+1)]) - 1; X X #ifdef UNSIGNED_NUMBERS_CAN_BE_NEGATIVE X- if(msf.cdmsf_frame1 < 0) X+ if(MSF_END_FRM < 0) X { X- msf.cdmsf_sec1 += msf.cdmsf_frame1; X- msf.cdmsf_frame1 = 0; X+ MSF_END_SEC += MSF_END_FRM; X+ MSF_END_FRM = 0; X } X- if(msf.cdmsf_sec1 < 0) X+ if(MSF_END_SEC < 0) X { X- msf.cdmsf_min1 += msf.cdmsf_sec1; X- msf.cdmsf_sec1 = 0; X+ MSF_END_MIN += MSF_END_SEC; X+ MSF_END_SEC = 0; X } X- if(msf.cdmsf_min1 < 0) X+ if(MSF_END_MIN < 0) X { X- msf.cdmsf_min1 = 0; X+ MSF_END_MIN = 0; X } X #endif X X- if( msf.cdmsf_sec0 > 60 && (offset<0) ) X+ if( MSF_START_SEC > 60 && (offset<0) ) X { X- msf.cdmsf_sec0 = 60-abs(offset); X- msf.cdmsf_min0--; X+ MSF_START_SEC = 60-abs(offset); X+ MSF_START_MIN--; X } X+ X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCPREVENT); X+#endif X X+#ifdef TCD_BSD X+ if(ioctl(cd->cd_dev, CDIOCPLAYMSF, &msf)) X+#else X if(ioctl(cd->cd_dev, CDROMPLAYMSF, &msf)) X+#endif X { X strcpy( cd->errmsg, "Error playing disc." ); X cd->err = TRUE; X X debug("cdrom.c: tcd_play_seconds error. CDROMPLAYMSF ioctl error.\n" ); X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X return(-1); X } X cd->isplayable=TRUE; X@@ -442,7 +605,15 @@ X if(cd->isplayable) tcd_stopcd(cd); X cd->err = FALSE; X X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X+ X+#ifdef TCD_BSD X+ if(!ioctl(cd->cd_dev, CDIOCEJECT)) X+#else X if(!ioctl(cd->cd_dev, CDROMEJECT)) X+#endif X { X cd->isplayable = FALSE; X strcpy(cd->errmsg, "No disc in drive "); X@@ -450,9 +621,17 @@ X } X else X { X+#ifdef TCD_BSD X+ tmp = ioctl( cd->cd_dev, CDIOCCLOSE ); X+#else X #ifdef CDROMCLOSETRAY X tmp = ioctl( cd->cd_dev, CDROMCLOSETRAY ); X #endif X+#endif X+ X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCPREVENT); X+#endif X X if(tcd_post_init(cd)) X { X@@ -461,6 +640,9 @@ X X debug("cdrom.c: tcd_eject - disc init error. %s\n", X strerror(errno) ); X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X X return(-1); X } X@@ -479,11 +661,19 @@ X debug("cdrom.c: tcd_stopcd(%p)\n", cd ); X X /* SDH: Makes things cleaner on eject */ X- if( cd->sc.cdsc_audiostatus==CDROM_AUDIO_PAUSED ) X+ if( SC_AUDIOSTATUS(cd->sc)==CDROM_AUDIO_PAUSED ) X tcd_pausecd(cd); X X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X+ X cd->err = FALSE; X+#ifdef TCD_BSD X+ if(ioctl(cd->cd_dev, CDIOCSTOP)) X+#else X if(ioctl(cd->cd_dev, CDROMSTOP)) X+#endif X { X strcpy( cd->errmsg, "Can't stop disc." ); X cd->err = TRUE; X@@ -501,31 +691,51 @@ X int tmp; X cd->err = FALSE; X X- if(cd->sc.cdsc_audiostatus==CDROM_AUDIO_PAUSED) X+ if(SC_AUDIOSTATUS(cd->sc)==CDROM_AUDIO_PAUSED) X { X+#ifdef TCD_BSD X+ if((tmp=ioctl(cd->cd_dev, CDIOCRESUME))) X+#else X if((tmp=ioctl(cd->cd_dev, CDROMRESUME))) X+#endif X { X strcpy(cd->errmsg, strerror(errno)); X cd->err = TRUE; X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X return(-1); X } X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCPREVENT); X+#endif X return tmp; X } X else X { X+#ifdef TCD_BSD X+ if((tmp=ioctl(cd->cd_dev, CDIOCPAUSE))) X+#else X if((tmp=ioctl(cd->cd_dev, CDROMPAUSE))) X+#endif X { X strcpy( cd->errmsg, strerror( errno ) ); X cd->err = TRUE; X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCALLOW); X+#endif X return(-1); X } X+#ifdef TCD_BSD X+ ioctl( cd->cd_dev, CDIOCPREVENT); X+#endif X return tmp; X } X } X X int tcd_change_disc( cd_struct *cd, int disc ) X { X-#ifdef TCD_CHANGER_ENABLED X+#if defined(TCD_CHANGER_ENABLED) && !defined(TCD_BSD) X int tmp; X cd->err = FALSE; X X--- tcd/linux-cdrom.h.orig Thu Feb 11 18:49:43 1999 X+++ tcd/linux-cdrom.h Wed Mar 3 10:57:00 1999 X@@ -27,11 +27,26 @@ X X #include <sys/types.h> X X-#if !defined(linux) && !defined(sun) && !defined(__sun__) X-#error TCD only builds on linux and Solaris/SunOs X-#endif X+#if defined(__FreeBSD__) X+ X+#define TCD_BSD X+ X+#include <sys/cdio.h> X X-#ifdef linux X+#define CDROM_AUDIO_INVALID CD_AS_AUDIO_INVALID X+#define CDROM_AUDIO_PLAY CD_AS_PLAY_IN_PROGRESS X+#define CDROM_AUDIO_PAUSED CD_AS_PLAY_PAUSED X+#define CDROM_AUDIO_COMPLETED CD_AS_PLAY_COMPLETED X+#define CDROM_AUDIO_ERROR CD_AS_PLAY_ERROR X+#define CDROM_AUDIO_NO_STATUS CD_AS_NO_STATUS X+ X+#define CDROM X+ X+#else X+ X+#define TCD_LINUX X+ X+#if defined(linux) X #include <linux/cdrom.h> X #endif X X@@ -98,6 +113,7 @@ X X #endif /* SVR4 */ X #endif /* sun __sun__ */ X+#endif /* __FreeBSD__ */ X X #define TRK_NAME_LEN 512 X #define DISC_INFO_LEN 512 X@@ -106,7 +122,17 @@ X struct cd_track X { X char name[TRK_NAME_LEN+1]; X+#ifdef TCD_BSD X+ struct cd_toc_entry toc; X+#define TOC_MINUTE(trk) (trk.toc.addr.msf.minute) X+#define TOC_SECOND(trk) (trk.toc.addr.msf.second) X+#define TOC_FRAME(trk) (trk.toc.addr.msf.frame) X+#else X struct cdrom_tocentry toc; X+#define TOC_MINUTE(trk) (trk.toc.cdte_addr.msf.minute) X+#define TOC_SECOND(trk) (trk.toc.cdte_addr.msf.second) X+#define TOC_FRAME(trk) (trk.toc.cdte_addr.msf.frame) X+#endif X int titled; X int start, length; X int tot_min, tot_sec; X@@ -130,10 +156,27 @@ X char dtitle[DISC_INFO_LEN+1]; /* Disc title */ X char album[DISC_INFO_LEN+1], artist[DISC_INFO_LEN+1]; X X+#ifdef TCD_BSD X+ /* See /usr/include/sys/cdio.h */ X+ struct ioc_play_track ti; X+ struct ioc_toc_header tochdr; X+ struct cd_sub_channel_info sc; X+#define SC_AUDIOSTATUS(sc) (sc.header.audio_status) X+#define SC_TRACK(sc) (sc.what.position.track_number) X+#define SC_MINUTE(sc) (sc.what.position.absaddr.msf.minute) X+#define SC_SECOND(sc) (sc.what.position.absaddr.msf.second) X+#define SC_FRAME(sc) (sc.what.position.absaddr.msf.frame) X+#else X /* See /usr/src/linux/include/linux/cdrom.h */ X struct cdrom_ti ti; /* Track info */ X struct cdrom_tochdr tochdr; /* TOC header */ X struct cdrom_subchnl sc; /* Subchannel, for time */ X+#define SC_AUDIOSTATUS(sc) (sc.cdsc_audiostatus) X+#define SC_TRACK(sc) (sc.cdsc_trk) X+#define SC_MINUTE(sc) (sc.cdsc_absaddr.msf.minute) X+#define SC_SECOND(sc) (sc.cdsc_absaddr.msf.second) X+#define SC_FRAME(sc) (sc.cdsc_absaddr.msf.frame) X+#endif X int volume; /* Must range 0-100 */ X X int cd_min, cd_sec; /* Total CD time */ X--- tcd/tcd.c.orig Mon Feb 8 21:13:22 1999 X+++ tcd/tcd.c Wed Mar 3 10:57:00 1999 X@@ -139,8 +139,8 @@ X X /* if the user hasn't stopped the cd, but it is X stopped anyway, fix it. */ X- if( cd->sc.cdsc_audiostatus != CDROM_AUDIO_PLAY && X- cd->sc.cdsc_audiostatus != CDROM_AUDIO_PAUSED ) X+ if( SC_AUDIOSTATUS(cd->sc) != CDROM_AUDIO_PLAY && X+ SC_AUDIOSTATUS(cd->sc) != CDROM_AUDIO_PAUSED ) X { X if( cd->play_method == REPEAT_CD ) X tcd_playtracks(cd, cd->first_t, cd->last_t, 0); END-of-./patches/patch-ae echo c - ./pkg mkdir -p ./pkg > /dev/null 2>&1 echo x - ./pkg/COMMENT sed 's/^X//' >./pkg/COMMENT << 'END-of-./pkg/COMMENT' XMultimedia applications for the GNOME desktop. END-of-./pkg/COMMENT echo x - ./pkg/DESCR sed 's/^X//' >./pkg/DESCR << 'END-of-./pkg/DESCR' XMultimedia applications for the GNOME desktop. Includes gtcd, a CDDB Xaware CD player; GMix, for controlling the sound card's mixer; and XVU-Meter, to slow down your desktop... END-of-./pkg/DESCR echo x - ./pkg/PLIST sed 's/^X//' >./pkg/PLIST << 'END-of-./pkg/PLIST' Xbin/cddbslave Xbin/gmix Xbin/gtcd Xbin/vumeter Xshare/gnome/apps/Multimedia/gmix.desktop Xshare/gnome/apps/Multimedia/gtcd.desktop Xshare/gnome/apps/Multimedia/vumeter.desktop Xshare/gnome/pixmaps/tcd/cdrom.xpm Xshare/gnome/pixmaps/tcd/eject.xpm Xshare/gnome/pixmaps/tcd/ff.xpm Xshare/gnome/pixmaps/tcd/goto.xpm Xshare/gnome/pixmaps/tcd/next_t.xpm Xshare/gnome/pixmaps/tcd/pause.xpm Xshare/gnome/pixmaps/tcd/play.xpm Xshare/gnome/pixmaps/tcd/prev_t.xpm Xshare/gnome/pixmaps/tcd/rw.xpm Xshare/gnome/pixmaps/tcd/stop.xpm Xshare/locale/da/LC_MESSAGES/gnome-media.mo Xshare/locale/de/LC_MESSAGES/gnome-media.mo Xshare/locale/es/LC_MESSAGES/gnome-media.mo Xshare/locale/fi/LC_MESSAGES/gnome-media.mo Xshare/locale/fr/LC_MESSAGES/gnome-media.mo Xshare/locale/ga/LC_MESSAGES/gnome-media.mo Xshare/locale/hu/LC_MESSAGES/gnome-media.mo Xshare/locale/it/LC_MESSAGES/gnome-media.mo Xshare/locale/ja/LC_MESSAGES/gnome-media.mo Xshare/locale/ko/LC_MESSAGES/gnome-media.mo Xshare/locale/nl/LC_MESSAGES/gnome-media.mo Xshare/locale/no/LC_MESSAGES/gnome-media.mo Xshare/locale/pt/LC_MESSAGES/gnome-media.mo Xshare/locale/ru_RU/LC_MESSAGES/gnome-media.mo X@dirrm share/gnome/pixmaps/tcd/ END-of-./pkg/PLIST echo x - ./Makefile sed 's/^X//' >./Makefile << 'END-of-./Makefile' X# New ports collection makefile for: gnome-media X# Version required: 1.0.1 X# Date created: 20 January 1999 X# Whom: Jeremy Lea <reg@shale.csir.co.za> X# X# $Id: $ X# X XDISTNAME= gnome-media-1.0.1 XPKGNAME= gnomemedia-1.0.1 XCATEGORIES= audio gnome XMASTER_SITES= ${MASTER_SITE_GNOME} XMASTER_SITE_SUBDIR= gnome-1.0/sources X XMAINTAINER= reg@shale.csir.co.za X XBUILD_DEPENDS= panel:${PORTSDIR}/x11/gnomecore XRUN_DEPENDS= panel:${PORTSDIR}/x11/gnomecore X X# implicit dependencies: X# gettext, esound, gnomelibs X XUSE_X_PREFIX= yes XUSE_GMAKE= yes XGNU_CONFIGURE= yes XCONFIGURE_ARGS= --without-ncurses \ X --localstatedir=${PREFIX}/share/gnome \ X --datadir=${PREFIX}/share/gnome \ X --with-gnome=${X11BASE} XCONFIGURE_ENV= CPPFLAGS="-I${LOCALBASE}/include" \ X LIBS="-L${LOCALBASE}/lib" X Xpost-install: X @${SETENV} OBJFORMAT=${PORTOBJFORMAT} ${LDCONFIG} -m ${PREFIX}/lib X X.include <bsd.port.mk> END-of-./Makefile exit >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-ports" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199903061808.UAA96762>