Skip to content

Commit

Permalink
Initial support for musicbrainz (only user so far is Linux CDROM, but…
Browse files Browse the repository at this point in the history
… later when adding .bin/.toc, it will be used there too)
mywave82 committed Jan 13, 2022

Verified

This commit was signed with the committer’s verified signature.
prometheanfire Matthew Thode
1 parent 7951df3 commit c793ca6
Showing 9 changed files with 1,159 additions and 12 deletions.
2 changes: 2 additions & 0 deletions Rules.make.in
Original file line number Diff line number Diff line change
@@ -75,6 +75,8 @@ FREETYPE2_LIBS=@FREETYPE2_LIBS@

LIBDISCID_CFLAGS=@LIBDISCID_CFLAGS@
LIBDISCID_LIBS=@LIBDISCID_LIBS@
LIBCJSON_CFLAGS=@LIBCJSON_CFLAGS@
LIBCJSON_LIBS=@LIBCJSON_LIBS@

# These affect what plugins are compiled in at some points
CDROM_SUPPORT=@CDROM_SUPPORT@
79 changes: 79 additions & 0 deletions configure
Original file line number Diff line number Diff line change
@@ -656,6 +656,8 @@ HAVE_ADPLUG
HAVE_ALSA
ALSA_LIBS
ALSA_CFLAGS
LIBCJSON_LIBS
LIBCJSON_CFLAGS
LIBDISCID_LIBS
LIBDISCID_CFLAGS
HAVE_SIDPLAYFP_BUILDERS_RESID_H
@@ -860,6 +862,8 @@ ADPLUG_LIBS
XA
LIBDISCID_CFLAGS
LIBDISCID_LIBS
LIBCJSON_CFLAGS
LIBCJSON_LIBS
ALSA_CFLAGS
ALSA_LIBS
OSS_CFLAGS
@@ -1587,6 +1591,10 @@ Some influential environment variables:
C compiler flags for LIBDISCID, overriding pkg-config
LIBDISCID_LIBS
linker flags for LIBDISCID, overriding pkg-config
LIBCJSON_CFLAGS
C compiler flags for LIBCJSON, overriding pkg-config
LIBCJSON_LIBS
linker flags for LIBCJSON, overriding pkg-config
ALSA_CFLAGS C compiler flags for ALSA, overriding pkg-config
ALSA_LIBS linker flags for ALSA, overriding pkg-config
OSS_CFLAGS C compiler flags for OSS, overriding pkg-config
@@ -12511,6 +12519,77 @@ $as_echo "yes" >&6; }

fi

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libcjson" >&5
$as_echo_n "checking for libcjson... " >&6; }

if test -n "$LIBCJSON_CFLAGS"; then
pkg_cv_LIBCJSON_CFLAGS="$LIBCJSON_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcjson\""; } >&5
($PKG_CONFIG --exists --print-errors "libcjson") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_LIBCJSON_CFLAGS=`$PKG_CONFIG --cflags "libcjson" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test -n "$LIBCJSON_LIBS"; then
pkg_cv_LIBCJSON_LIBS="$LIBCJSON_LIBS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcjson\""; } >&5
($PKG_CONFIG --exists --print-errors "libcjson") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_LIBCJSON_LIBS=`$PKG_CONFIG --libs "libcjson" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi



if test $pkg_failed = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
_pkg_short_errors_supported=yes
else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
LIBCJSON_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libcjson" 2>&1`
else
LIBCJSON_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libcjson" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$LIBCJSON_PKG_ERRORS" >&5

as_fn_error $? "libcjson not found" "$LINENO" 5
elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
as_fn_error $? "libcjson not found" "$LINENO" 5
else
LIBCJSON_CFLAGS=$pkg_cv_LIBCJSON_CFLAGS
LIBCJSON_LIBS=$pkg_cv_LIBCJSON_LIBS
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

fi

if test "x$with_alsa" != "xno"; then :


1 change: 1 addition & 0 deletions configure.ac
Original file line number Diff line number Diff line change
@@ -651,6 +651,7 @@ AC_SUBST(HAVE_SIDPLAYFP_BUILDERS_RESID_H)
AC_LANG_POP()
PKG_CHECK_MODULES([LIBDISCID],[libdiscid],[],[AC_MSG_ERROR([libdiscid not found])])
PKG_CHECK_MODULES([LIBCJSON],[libcjson],[],[AC_MSG_ERROR([libcjson not found])])
AS_IF([test "x$with_alsa" != "xno"],[
PKG_CHECK_MODULES([ALSA],[alsa],[],[
15 changes: 13 additions & 2 deletions filesel/Makefile
Original file line number Diff line number Diff line change
@@ -27,8 +27,9 @@ filesystem-unix.o \
filesystem-z.o \
filesystem-zip.o \
fsptype.o \
modlist.o \
mdb.o \
modlist.o \
musicbrainz.o \
pfilesel.o \
pfsmain.o

@@ -51,7 +52,7 @@ cdrom$(LIB_SUFFIX): $(cdrom_so)
$(CC) $(SHARED_FLAGS) -o $@ $^ $(PTHREAD_LIBS) $(LIBDISCID_LIBS)

pfilesel$(LIB_SUFFIX): $(pfilesel_so)
$(CC) $(SHARED_FLAGS) $(MATH_LIBS) $(ICONV_LIBS) -o $@ $^ -lbz2 -lz
$(CC) $(SHARED_FLAGS) -o $@ $^ -lbz2 -lz $(MATH_LIBS) $(ICONV_LIBS) $(LIBCJSON_LIBS)

clean:
rm -f *.o *$(LIB_SUFFIX) adbmeta-test dirdb-test filesystem-bzip2-test filesystem-filehandle-cache-test filesystem-gzip-test filesystem-tar-test mdb-test
@@ -124,6 +125,7 @@ cdrom.o: cdrom.c \
filesystem-drive.h \
filesystem-file-mem.h \
mdb.h \
musicbrainz.h \
pfilesel.h \
../stuff/err.h
$(CC) $< -o $@ -c $(LIBDISCID_CFLAGS)
@@ -362,6 +364,14 @@ mdb-test: mdb-test.c \
../stuff/imsrtns.h
$(CC) $< -o $@

musicbrainz.o: musicbrainz.c \
../config.h \
../types.h \
../boot/psetting.h \
musicbrainz.h \
../stuff/compat.h
$(CC) $< -o $@ -c $(LIBCJSON_CFLAGS)

cphlpfs.o: cphlpfs.c \
../config.h \
../types.h \
@@ -416,6 +426,7 @@ pfilesel.o: pfilesel.c \
filesystem-zip.h \
mdb.h \
modlist.h \
musicbrainz.h \
pfilesel.h \
../stuff/compat.h \
../stuff/framelock.h \
90 changes: 80 additions & 10 deletions filesel/cdrom.c
Original file line number Diff line number Diff line change
@@ -47,6 +47,7 @@
#include "filesystem-drive.h"
#include "filesystem-file-mem.h"
#include "mdb.h"
#include "musicbrainz.h"
#include "pfilesel.h"
#include "stuff/err.h"

@@ -67,6 +68,8 @@ static struct cdrom_t

struct ioctl_cdrom_readtoc_request_t lasttoc;
char *lastdiscid;
void *musicbrainzhandle;
struct musicbrainz_database_h *musicbrainzdata;
} *cdroms = 0;
static int cdromn = 0;

@@ -141,6 +144,8 @@ static void try(const char *dev, const char *vdev)
cdroms[cdromn].request_returnvalue=0;
cdroms[cdromn].shutdown=0;
cdroms[cdromn].lastdiscid=0;
cdroms[cdromn].musicbrainzhandle=0;
cdroms[cdromn].musicbrainzdata=0;

fcntl(fd, F_SETFD, 1);
cdromn++;
@@ -702,12 +707,23 @@ static ocpdirhandle_pt cdrom_drive_readdir_start (struct ocpdir_t *_self, void(*
if (t)
{
dh->owner->cdrom->lastdiscid = strdup(t);
}
failout:
if (did)
if (dh->owner->cdrom->musicbrainzhandle)
{
musicbrainz_lookup_discid_cancel (dh->owner->cdrom->musicbrainzhandle);
dh->owner->cdrom->musicbrainzhandle = 0;
}
if (dh->owner->cdrom->musicbrainzdata)
{
discid_free (did);
musicbrainz_database_h_free (dh->owner->cdrom->musicbrainzdata);
dh->owner->cdrom->musicbrainzdata = 0;
}
dh->owner->cdrom->musicbrainzhandle = musicbrainz_lookup_discid_init (dh->owner->cdrom->lastdiscid, &dh->owner->cdrom->musicbrainzdata);
}
failout:
if (did)
{
discid_free (did);
}
}

return dh;
@@ -738,6 +754,16 @@ static int cdrom_drive_readdir_iterate (ocpdirhandle_pt _dh)
struct moduleinfostruct mi;
char filename[64];

if (dh->owner->cdrom->musicbrainzhandle)
{
if (musicbrainz_lookup_discid_iterate (dh->owner->cdrom->musicbrainzhandle, &dh->owner->cdrom->musicbrainzdata))
{
usleep (1000); /* anything is better than nothing... */
return 1; /* this will throttle this CPU core */
}
dh->owner->cdrom->musicbrainzhandle = 0;
}

if ((dh->i > dh->tochdr.cdth_trk1) || (dh->i >= 100)) /* last check is not actually needed */
{
if (dh->initlba >= 0) /* did we initialize? Create the DISC.CDA that covers the entire disc */
@@ -773,8 +799,28 @@ static int cdrom_drive_readdir_iterate (ocpdirhandle_pt _dh)
mi.modtype.integer.i=MODULETYPE("CDA");
mi.channels=2;
mi.playtime=(dh->lastlba - dh->initlba) / CD_FRAMES;
strcpy(mi.comment, dh->owner->cdrom->vdev);
strcpy(mi.title, "CDROM audio disc");
if (dh->owner->cdrom->musicbrainzdata)
{
strcpy(mi.comment, "Looked up via Musicbrainz");
} else {
strcpy(mi.comment, dh->owner->cdrom->vdev);
}
if (dh->owner->cdrom->musicbrainzdata && dh->owner->cdrom->musicbrainzdata->album[0])
{
snprintf (mi.title, sizeof (mi.title), "%s", dh->owner->cdrom->musicbrainzdata->album);
snprintf (mi.album, sizeof (mi.album), "%s", dh->owner->cdrom->musicbrainzdata->album);
} else if (!mi.title[0])
{
strcpy(mi.title, "CDROM audio disc");
}
if (dh->owner->cdrom->musicbrainzdata && dh->owner->cdrom->musicbrainzdata->artist[0][0])
{
snprintf (mi.artist, sizeof (mi.artist), "%s", dh->owner->cdrom->musicbrainzdata->artist[0]);
}
if (dh->owner->cdrom->musicbrainzdata && dh->owner->cdrom->musicbrainzdata->date[0])
{
mi.date = dh->owner->cdrom->musicbrainzdata->date[0];
}
mdbWriteModuleInfo (mdb_ref, &mi);
}
}
@@ -788,7 +834,7 @@ static int cdrom_drive_readdir_iterate (ocpdirhandle_pt _dh)
if (!dh->owner->cdrom->lasttoc.track[dh->i].is_data)
{
snprintf(filename, sizeof (filename), "%sTRACK%02u.CDA", dh->owner->cdrom->lastdiscid ? dh->owner->cdrom->lastdiscid : "", dh->i);
int len = (dh->owner->cdrom->lasttoc.track[dh->i + 1].lba_addr - dh->owner->cdrom->lasttoc.track[dh->i].lba_addr) * 2352;
int len = (dh->owner->cdrom->lasttoc.track[dh->i + 1].lba_addr - dh->owner->cdrom->lasttoc.track[dh->i].lba_addr);

if (dh->initlba < 0)
{
@@ -818,16 +864,40 @@ static int cdrom_drive_readdir_iterate (ocpdirhandle_pt _dh)

dh->owner->head.ref (&dh->owner->head);
file->cdrom = dh->owner->cdrom;
mdb_ref = mdbGetModuleReference2 (file->head.dirdb_ref, len);
mdb_ref = mdbGetModuleReference2 (file->head.dirdb_ref, len * 2352);
if (mdb_ref != UINT32_MAX)
{
if (mdbGetModuleInfo(&mi, mdb_ref))
{
mi.modtype.integer.i=MODULETYPE("CDA");
mi.channels=2;
mi.playtime=len / CD_FRAMES;
strcpy(mi.comment, dh->owner->cdrom->vdev);
strcpy(mi.title, "CDROM audio track");
if (dh->owner->cdrom->musicbrainzdata)
{
strcpy(mi.comment, "Looked up via Musicbrainz");
} else {
strcpy(mi.comment, dh->owner->cdrom->vdev);
}
if (dh->owner->cdrom->musicbrainzdata && dh->owner->cdrom->musicbrainzdata->album[0])
{
snprintf (mi.album, sizeof (mi.album), "%s", dh->owner->cdrom->musicbrainzdata->album);
}
if (dh->owner->cdrom->musicbrainzdata && dh->owner->cdrom->musicbrainzdata->title[dh->i])
{
snprintf (mi.title, sizeof (mi.title), "%s", dh->owner->cdrom->musicbrainzdata->title[dh->i]);
} else if (!mi.title[0])
{
strcpy(mi.title, "CDROM audio track");
}
if (dh->owner->cdrom->musicbrainzdata && dh->owner->cdrom->musicbrainzdata->artist[dh->i][0])
{
snprintf (mi.artist, sizeof (mi.artist), "%s", dh->owner->cdrom->musicbrainzdata->artist[dh->i]);
}
if (dh->owner->cdrom->musicbrainzdata && dh->owner->cdrom->musicbrainzdata->date[dh->i])
{
mi.date = dh->owner->cdrom->musicbrainzdata->date[dh->i];
}

mdbWriteModuleInfo (mdb_ref, &mi);
}
}
2 changes: 2 additions & 0 deletions filesel/fsptype.c
Original file line number Diff line number Diff line change
@@ -52,6 +52,8 @@ static int fsReadInfo(struct moduleinfostruct *m, struct ocpfilehandle_t *fp, co
strcpy(m->title, "openCP dirdb/medialib: db v1");
if (!memcmp(buf, dirdbsigv2, sizeof(dirdbsigv2)))
strcpy(m->title, "openCP dirdb/medialib: db v2");
if (!memcmp(buf, "Cubic Player MusicBrainz Data Base\x1B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 64))
strcpy(m->title, "openCP MusicBrainz Data Base");
return 0;
}

Loading

0 comments on commit c793ca6

Please sign in to comment.