static gboolean xmms_metadata_test_xform_init (xmms_xform_t *xform) { const gchar *musicbrainz_va_id = "89ad4ac3-39f7-470e-963a-56509c546377"; const gchar *title, *rpgain; gint track, totaltracks, compilation; CU_ASSERT_FALSE (xmms_xform_metadata_mapper_match (xform, "missing", "missing", -1)); /* Basic string mapping */ CU_ASSERT_TRUE (xmms_xform_metadata_mapper_match (xform, "title", "the title", -1)); CU_ASSERT_TRUE (xmms_xform_metadata_get_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_TITLE, &title)); CU_ASSERT_STRING_EQUAL ("the title", title); /* Mapping track number, without total tracks */ CU_ASSERT_TRUE (xmms_xform_metadata_mapper_match (xform, "tracknr", "1", -1)); CU_ASSERT_TRUE (xmms_xform_metadata_get_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_TRACKNR, &track)); CU_ASSERT_FALSE (xmms_xform_metadata_get_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_TOTALTRACKS, &totaltracks)); CU_ASSERT_EQUAL (1, track); /* Mapping track number, with total tracks */ CU_ASSERT_TRUE (xmms_xform_metadata_mapper_match (xform, "tracknr", "1/10", -1)); CU_ASSERT_TRUE (xmms_xform_metadata_get_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_TRACKNR, &track)); CU_ASSERT_TRUE (xmms_xform_metadata_get_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_TOTALTRACKS, &totaltracks)); CU_ASSERT_EQUAL (1, track); CU_ASSERT_EQUAL (10, totaltracks); /* Broken track number */ CU_ASSERT_FALSE (xmms_xform_metadata_mapper_match (xform, "tracknr", "bad", -1)); /* Mapping compilation indicator to boolean compilation */ CU_ASSERT_TRUE (xmms_xform_metadata_mapper_match (xform, "compilation", "1", -1)); CU_ASSERT_TRUE (xmms_xform_metadata_get_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_COMPILATION, &compilation)); CU_ASSERT_EQUAL (TRUE, compilation); /* Mapping compilation indicator to boolean compilation */ CU_ASSERT_TRUE (xmms_xform_metadata_mapper_match (xform, "compilation", musicbrainz_va_id, -1)); CU_ASSERT_TRUE (xmms_xform_metadata_get_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_COMPILATION, &compilation)); CU_ASSERT_EQUAL (TRUE, compilation); /* Mapping replaygain to the format the replaygain xform expects */ CU_ASSERT_TRUE (xmms_xform_metadata_mapper_match (xform, "replaygain_track_gain", "-14.69", -1)); CU_ASSERT_TRUE (xmms_xform_metadata_get_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_GAIN_TRACK, &rpgain)); CU_ASSERT_STRING_EQUAL ("0.18428", rpgain); CU_ASSERT_TRUE (xmms_xform_metadata_mapper_match (xform, "replaygain_track_gain", "-14.69 dB", -1)); CU_ASSERT_TRUE (xmms_xform_metadata_get_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_GAIN_TRACK, &rpgain)); CU_ASSERT_STRING_EQUAL ("0.18428", rpgain); CU_ASSERT_TRUE (xmms_xform_metadata_mapper_match (xform, "coverart", "test", 10)); xmms_xform_outdata_type_add (xform, XMMS_STREAM_TYPE_MIMETYPE, "audio/pcm", XMMS_STREAM_TYPE_END); return TRUE; }
static void compute_gain (xmms_xform_t *xform, xmms_replaygain_data_t *data) { gfloat s, p; const gchar *key_s, *key_p, *tmp; if (data->mode == XMMS_REPLAYGAIN_MODE_TRACK) { key_s = XMMS_MEDIALIB_ENTRY_PROPERTY_GAIN_TRACK; key_p = XMMS_MEDIALIB_ENTRY_PROPERTY_PEAK_TRACK; } else { key_s = XMMS_MEDIALIB_ENTRY_PROPERTY_GAIN_ALBUM; key_p = XMMS_MEDIALIB_ENTRY_PROPERTY_PEAK_ALBUM; } /** @todo should this be ints instead? */ if (xmms_xform_metadata_get_str (xform, key_s, &tmp)) { s = atof (tmp); } else { s = 1.0; } if (xmms_xform_metadata_get_str (xform, key_p, &tmp)) { p = atof (tmp); } else { p = 1.0; } s *= data->preamp; if (data->use_anticlip && s * p > 1.0) { s = 1.0 / p; } data->gain = MIN (s, 15.0); /* This is NOT a value calculated by some scientist who has * studied the ear for two decades. * If you have a better value holler now, or keep your peace * forever. */ data->has_replaygain = (fabs (data->gain - 1.0) > 0.001); }
static void handle_id3v2_txxx (xmms_xform_t *xform, xmms_id3v2_header_t *head, const gchar *_key, gchar *buf, gsize len) { const gchar *enc; gchar *cbuf; const gchar *key, *val; const gchar *metakey; gsize clen; enc = binary_to_enc (buf[0]); cbuf = convert_id3_text (enc, &buf[1], len - 1, &clen); if (!cbuf) return; key = cbuf; val = find_nul (cbuf, &clen); if (!val) { g_free (cbuf); return; } if (g_ascii_strcasecmp (key, "MusicBrainz Album Id") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ALBUM_ID; xmms_xform_metadata_set_str (xform, metakey, val); } else if (g_ascii_strcasecmp (key, "MusicBrainz Artist Id") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ARTIST_ID; xmms_xform_metadata_set_str (xform, metakey, val); } else if ((g_ascii_strcasecmp (key, "MusicBrainz Album Artist Id") == 0) && (g_ascii_strcasecmp (val, MUSICBRAINZ_VA_ID) == 0)) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_COMPILATION; xmms_xform_metadata_set_int (xform, metakey, 1); } else if (g_ascii_strcasecmp (key, "ASIN") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ASIN; xmms_xform_metadata_set_str (xform, metakey, val); } else if (g_ascii_strcasecmp (key, "QuodLibet::albumartist") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ALBUM_ARTIST; xmms_xform_metadata_set_str (xform, metakey, val); // ArtistAlbumSort as last resort } else if ((g_ascii_strcasecmp (key, "ALBUMARTISTSORT") == 0)) { const gchar *tmp; metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ALBUM_ARTIST; if (xmms_xform_metadata_get_str (xform, metakey, &tmp) && !strlen (tmp)) { xmms_xform_metadata_set_str (xform, metakey, val); } } g_free (cbuf); }
void xmms_xform_metadata_set_str (xmms_xform_t *xform, const char *key, const char *val) { const char *old; if (!g_utf8_validate (val, -1, NULL)) { xmms_log_error ("xform '%s' tried to set property '%s' to a NON UTF-8 string!", xmms_xform_shortname (xform), key); return; } if (xmms_xform_metadata_get_str (xform, key, &old)) { if (strcmp (old, val) == 0) { return; } } g_hash_table_insert (xform->metadata, g_strdup (key), xmmsv_new_string (val)); xform->metadata_changed = TRUE; }
static gboolean xmms_gme_init (xmms_xform_t *xform) { xmms_gme_data_t *data; gme_err_t init_error; GString *file_contents; /* The raw data from the file. */ gme_info_t *metadata = NULL; xmms_config_property_t *val; int loops; int maxlength; const char *subtune_str; int subtune = 0; long fadelen = -1; int samplerate; double stereodepth; g_return_val_if_fail (xform, FALSE); data = g_new0 (xmms_gme_data_t, 1); xmms_xform_private_data_set (xform, data); val = xmms_xform_config_lookup (xform, "samplerate"); samplerate = xmms_config_property_get_int (val); if (samplerate < 1) samplerate = GME_DEFAULT_SAMPLE_RATE; data->samplerate = samplerate; xmms_xform_outdata_type_add (xform, XMMS_STREAM_TYPE_MIMETYPE, "audio/pcm", /* PCM samples */ XMMS_STREAM_TYPE_FMT_FORMAT, XMMS_SAMPLE_FORMAT_S16, /* 16-bit signed */ XMMS_STREAM_TYPE_FMT_CHANNELS, 2, /* stereo */ XMMS_STREAM_TYPE_FMT_SAMPLERATE, samplerate, XMMS_STREAM_TYPE_END); file_contents = g_string_new (""); for (;;) { xmms_error_t error; gchar buf[4096]; gint ret; ret = xmms_xform_read (xform, buf, sizeof (buf), &error); if (ret == -1) { XMMS_DBG ("Error reading emulated music data"); return FALSE; } if (ret == 0) { break; } g_string_append_len (file_contents, buf, ret); } init_error = gme_open_data (file_contents->str, file_contents->len, &data->emu, samplerate); g_string_free (file_contents, TRUE); if (init_error) { XMMS_DBG ("gme_open_data returned an error: %s", init_error); return FALSE; } if (xmms_xform_metadata_get_str (xform, "subtune", &subtune_str)) { subtune = strtol (subtune_str, NULL, 10); XMMS_DBG ("Setting subtune to %d", subtune); if ((subtune < 0 || subtune > gme_track_count (data->emu))) { XMMS_DBG ("Invalid subtune index"); return FALSE; } } else { xmms_xform_metadata_set_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_SUBTUNES, gme_track_count (data->emu)); } /* * Get metadata here */ init_error = gme_track_info (data->emu, &metadata, subtune); if (init_error) { XMMS_DBG ("Couldn't get GME track info: %s", init_error); init_error = ""; } else { xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_TITLE, metadata->song); xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_ARTIST, metadata->author); xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_ALBUM, metadata->game); xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_COMMENT, metadata->comment); xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_YEAR, metadata->copyright); xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_GENRE, metadata->system); /* I mapped genre to the system type */ val = xmms_xform_config_lookup (xform, "loops"); loops = xmms_config_property_get_int (val); XMMS_DBG ("intro_length = %d, loops = %d, loop_length = %d", metadata->intro_length, loops, metadata->loop_length); if (metadata->intro_length > 0) { if ((loops > 0) && (metadata->loop_length > 0)) { fadelen = metadata->intro_length + loops * metadata->loop_length; XMMS_DBG ("fadelen now = %ld", fadelen); } else { fadelen = metadata->length; XMMS_DBG ("fadelen now = %ld", fadelen); } } } val = xmms_xform_config_lookup (xform, "maxlength"); maxlength = xmms_config_property_get_int (val); XMMS_DBG ("maxlength = %d seconds", maxlength); if (maxlength > 0 && (fadelen < 0 || (maxlength * 1000L < fadelen))) { fadelen = maxlength * 1000L; XMMS_DBG ("fadelen now = %ld", fadelen); } XMMS_DBG ("gme.fadelen = %ld", fadelen); val = xmms_xform_config_lookup (xform, "stereodepth"); stereodepth = xmms_config_property_get_float (val); if (stereodepth >= 0.0 && stereodepth <= 1.0) { XMMS_DBG ("Setting stereo depth to %f.", stereodepth); gme_set_stereo_depth (data->emu, stereodepth); } else { XMMS_DBG ("gme.stereodepth = %f out of range 0.0 - 1.0; not setting.", stereodepth); } init_error = gme_start_track (data->emu, subtune); if (init_error) { XMMS_DBG ("gme_start_track returned an error: %s", init_error); gme_free_info (metadata); return FALSE; } if (fadelen > 0) { XMMS_DBG ("Setting song length and fade length..."); xmms_xform_metadata_set_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_DURATION, fadelen); gme_set_fade (data->emu, fadelen); } gme_free_info (metadata); return TRUE; }
static void xmms_sid_get_songlength (xmms_xform_t *xform) { xmms_config_property_t *config; const gchar *tmp, *md5sum, *songlength_path; gint subtune = 1; GIOChannel* io; GString *buf; g_return_if_fail (xform); config = xmms_xform_config_lookup (xform, "songlength_path"); g_return_if_fail (config); songlength_path = xmms_config_property_get_string (config); if (!songlength_path[0]) return; if (xmms_xform_metadata_get_str (xform, "subtune", &tmp)) { subtune = atoi (tmp); } if (!xmms_xform_metadata_get_str (xform, "HVSCfingerprint", &md5sum)) { return; } io = g_io_channel_new_file (songlength_path, "r", NULL); if (!io) { xmms_log_error ("Unable to load songlengths database '%s'", songlength_path); return; } buf = g_string_new (""); while (g_io_channel_read_line_string (io, buf, NULL, NULL) == G_IO_STATUS_NORMAL) { if (buf->len > 33 && g_ascii_strncasecmp (buf->str, md5sum, 32) == 0) { gint cur = 0; gchar *b; b = buf->str + 33; while (*b) { gint min, sec; /* read timestamp */ if (sscanf (b, "%d:%d", &min, &sec) != 2) { /* no more timestamps on this line */ break; } else { cur++; } if (cur == subtune) { const gchar *metakey; gchar ms_str[10 + 1]; /* LONG_MAX in str, \w NULL */ glong ms; ms = (min * 60 + sec) * 1000; metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_DURATION; xmms_xform_metadata_set_int (xform, metakey, ms); if (g_snprintf (ms_str, 10 + 1, "%ld", ms) > 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_STARTMS; xmms_xform_metadata_set_str (xform, metakey, "0"); metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_STOPMS; xmms_xform_metadata_set_str (xform, metakey, ms_str); } goto done; } /* forward to next possible timestamp */ b = strchr (b, ' '); if (!b) { /* no more timestamps on this line */ break; } b++; } } } xmms_log_info ("Couldn't find sid tune in songlength.txt"); done: g_io_channel_unref (io); }
static gboolean xmms_sid_init (xmms_xform_t *xform) { xmms_sid_data_t *data; const char *subtune; gint ret; data = g_new0 (xmms_sid_data_t, 1); data->wrapper = sidplay_wrapper_init (); xmms_xform_private_data_set (xform, data); data->buffer = g_string_new (""); for (;;) { xmms_error_t error; gchar buf[4096]; gint ret; ret = xmms_xform_read (xform, buf, sizeof (buf), &error); if (ret == -1) { XMMS_DBG ("Error reading sid file"); return FALSE; } if (ret == 0) { break; } g_string_append_len (data->buffer, buf, ret); } ret = sidplay_wrapper_load (data->wrapper, data->buffer->str, data->buffer->len); if (ret < 0) { XMMS_DBG ("Couldn't load sid file"); return FALSE; } if (xmms_xform_metadata_get_str (xform, "subtune", &subtune)) { int num; num = atoi (subtune); if (num < 1 || num > sidplay_wrapper_subtunes (data->wrapper)) { XMMS_DBG ("Invalid subtune index"); return FALSE; } sidplay_wrapper_set_subtune (data->wrapper, num); } xmms_sid_get_media_info (xform); xmms_xform_outdata_type_add (xform, XMMS_STREAM_TYPE_MIMETYPE, "audio/pcm", XMMS_STREAM_TYPE_FMT_FORMAT, XMMS_SAMPLE_FORMAT_S16, XMMS_STREAM_TYPE_FMT_CHANNELS, 2, XMMS_STREAM_TYPE_FMT_SAMPLERATE, 44100, XMMS_STREAM_TYPE_END); return TRUE; }