noinst_HEADERS = \
all.h \
canonical_tag.h \
- dither.h
+ charset.h \
+ dither.h \
+ id3v1.h \
+ id3v2.h
libplugin_common_a_SOURCES = \
canonical_tag.c \
- dither.c
+ charset.c \
+ dither.c \
+ id3v1.c \
+ id3v2.c
EXTRA_DIST = \
Makefile.lite \
OBJS = \
canonical_tag.o \
- dither.o
+ charset.o \
+ dither.o \
+ id3v1.o
include ../../build/lib.mk
\r
C_FILES= \\r
canonical_tag.c \\r
- dither.c\r
+ charset.c \\r
+ dither.c \\r
+ id3v1.c\r
\r
OBJS= $(C_FILES:.c=.obj)\r
\r
/* plugin_common - Routines common to several plugins
* Copyright (C) 2002 Josh Coalson
*
- * dithering routine derived from (other GPLed source):
- * mad - MPEG audio decoder
- * Copyright (C) 2000-2001 Robert Leslie
- *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
#define FLAC__PLUGIN_COMMON__ALL_H
#include "canonical_tag.h"
+#include "charset.h"
#include "dither.h"
+#include "id3v1.h"
+#include "id3v2.h"
+#include "locale_hack.h"
#endif
/* plugin_common - Routines common to several plugins
* Copyright (C) 2002 Josh Coalson
*
- * dithering routine derived from (other GPLed source):
- * mad - MPEG audio decoder
- * Copyright (C) 2000-2001 Robert Leslie
- *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#include <stdlib.h>
+#include <stdio.h>
+
#include "canonical_tag.h"
#include "FLAC/assert.h"
+
+static void local__safe_free(void *object)
+{
+ if(0 != object)
+ free(object);
+}
+
+static void local__copy_field(char **dest, const char *src, unsigned n)
+{
+ if(n > 0) {
+ const char *p = src + n;
+ while(p > src && *(--p) == ' ')
+ ;
+ n = p - src + 1;
+ if(0 != (*dest = malloc(n+1))) {
+ memcpy(*dest, src, n);
+ (*dest)[n] = '\0';
+ }
+ }
+ else
+ *dest = 0;
+}
+
+FLAC_Plugin__CanonicalTag *FLAC_plugin__canonical_tag_new()
+{
+ FLAC_Plugin__CanonicalTag *object = (FLAC_Plugin__CanonicalTag*)malloc(sizeof(FLAC_Plugin__CanonicalTag));
+ if(0 != object)
+ FLAC_plugin__canonical_tag_init(object);
+ return object;
+}
+
+void FLAC_plugin__canonical_tag_delete(FLAC_Plugin__CanonicalTag *object)
+{
+ FLAC__ASSERT(0 != object);
+ FLAC_plugin__canonical_tag_clear(object);
+ free(object);
+}
+
+void FLAC_plugin__canonical_tag_init(FLAC_Plugin__CanonicalTag *object)
+{
+ FLAC__ASSERT(0 != object);
+ object->title = 0;
+ object->artist = 0;
+ object->performer = 0;
+ object->album = 0;
+ object->year_recorded = 0;
+ object->year_performed = 0;
+ object->track_number = 0;
+ object->tracks_in_album = 0;
+ object->genre = 0;
+ object->comment = 0;
+}
+
+void FLAC_plugin__canonical_tag_clear(FLAC_Plugin__CanonicalTag *object)
+{
+ FLAC__ASSERT(0 != object);
+ local__safe_free(object->title);
+ local__safe_free(object->artist);
+ local__safe_free(object->performer);
+ local__safe_free(object->album);
+ local__safe_free(object->year_recorded);
+ local__safe_free(object->year_performed);
+ local__safe_free(object->track_number);
+ local__safe_free(object->tracks_in_album);
+ local__safe_free(object->genre);
+ local__safe_free(object->comment);
+ FLAC_plugin__canonical_tag_init(object);
+}
+
+void FLAC_plugin__canonical_tag_convert_from_id3v1(FLAC_Plugin__CanonicalTag *object, const FLAC_Plugin__Id3v1_Tag *id3v1_tag)
+{
+ local__copy_field(&object->title, id3v1_tag->title, 30);
+ local__copy_field(&object->artist, id3v1_tag->artist, 30);
+ local__copy_field(&object->album, id3v1_tag->album, 30);
+ local__copy_field(&object->year_performed, id3v1_tag->year, 4);
+
+ /* Check for v1.1 tags. */
+ if (id3v1_tag->comment.v1_1.zero == 0) {
+ if(0 != (object->track_number = malloc(4)))
+ sprintf(object->track_number, "%u", (unsigned)id3v1_tag->comment.v1_1.track);
+ local__copy_field(&object->comment, id3v1_tag->comment.v1_1.comment, 28);
+ }
+ else {
+ object->track_number = strdup("0");
+ local__copy_field(&object->comment, id3v1_tag->comment.v1_0.comment, 30);
+ }
+
+ object->genre = strdup(FLAC_plugin__id3v1_tag_get_genre_as_string(id3v1_tag->genre));
+}
/* plugin_common - Routines common to several plugins
* Copyright (C) 2002 Josh Coalson
*
- * dithering routine derived from (other GPLed source):
- * mad - MPEG audio decoder
- * Copyright (C) 2000-2001 Robert Leslie
- *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
#ifndef FLAC__PLUGIN_COMMON__CANONICAL_TAG_H
#define FLAC__PLUGIN_COMMON__CANONICAL_TAG_H
+#include "id3v1.h"
+
+typedef struct {
+ char *title;
+ char *artist;
+ char *performer;
+ char *album;
+ char *year_recorded;
+ char *year_performed;
+ char *track_number;
+ char *tracks_in_album;
+ char *genre;
+ char *comment;
+} FLAC_Plugin__CanonicalTag;
+
+FLAC_Plugin__CanonicalTag *FLAC_plugin__canonical_tag_new();
+void FLAC_plugin__canonical_tag_delete(FLAC_Plugin__CanonicalTag *);
+void FLAC_plugin__canonical_tag_init(FLAC_Plugin__CanonicalTag *);
+void FLAC_plugin__canonical_tag_clear(FLAC_Plugin__CanonicalTag *);
+
+void FLAC_plugin__canonical_tag_convert_from_id3v1(FLAC_Plugin__CanonicalTag *, const FLAC_Plugin__Id3v1_Tag *);
+
#endif
#define max(a,b) ((a)>(b)?(a):(b))
-#define FLAC__DO_DITHER
-
-#define MAX_SUPPORTED_CHANNELS 2
-
#if defined _MSC_VER || defined __MINGW32__
#define FLAC__INLINE __inline
#else
return output >> scalebits;
}
-unsigned FLAC__plugin_common__pack_pcm(FLAC__byte *data, FLAC__int32 *input, unsigned wide_samples, unsigned channels, unsigned source_bps, unsigned target_bps)
+unsigned FLAC__plugin_common__pack_pcm_signed_little_endian(FLAC__byte *data, FLAC__int32 *input, unsigned wide_samples, unsigned channels, unsigned source_bps, unsigned target_bps)
{
- static dither_state dither[MAX_SUPPORTED_CHANNELS];
+ static dither_state dither[FLAC_PLUGIN__MAX_SUPPORTED_CHANNELS];
FLAC__byte * const start = data;
FLAC__int32 sample;
unsigned samples = wide_samples * channels;
const unsigned bytes_per_sample = target_bps / 8;
- FLAC__ASSERT(MAX_SUPPORTED_CHANNELS == 2);
- FLAC__ASSERT(channels > 0 && channels <= MAX_SUPPORTED_CHANNELS);
+ FLAC__ASSERT(FLAC_PLUGIN__MAX_SUPPORTED_CHANNELS == 2);
+ FLAC__ASSERT(channels > 0 && channels <= FLAC_PLUGIN__MAX_SUPPORTED_CHANNELS);
FLAC__ASSERT(source_bps < 32);
FLAC__ASSERT(target_bps <= 24);
FLAC__ASSERT(target_bps <= source_bps);
/* plugin_common - Routines common to several plugins
* Copyright (C) 2002 Josh Coalson
*
- * dithering routine derived from (other GPLed source):
- * mad - MPEG audio decoder
- * Copyright (C) 2000-2001 Robert Leslie
- *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
#include "FLAC/ordinals.h"
-unsigned FLAC__plugin_common__pack_pcm(FLAC__byte *data, FLAC__int32 *input, unsigned wide_samples, unsigned channels, unsigned source_bps, unsigned target_bps);
+#define FLAC_PLUGIN__MAX_SUPPORTED_CHANNELS 2
+
+unsigned FLAC__plugin_common__pack_pcm_signed_little_endian(FLAC__byte *data, FLAC__int32 *input, unsigned wide_samples, unsigned channels, unsigned source_bps, unsigned target_bps);
#endif