Blame src/tests/plain_id3.c

Packit c32a2d
/* Just printing out ID3 tags with plain data from libmpg123 and explicitly called conversion routine. */
Packit c32a2d
Packit c32a2d
#include "compat.h"
Packit c32a2d
#include <mpg123.h>
Packit c32a2d
#include "debug.h"
Packit c32a2d
Packit c32a2d
int test_whence(const char* path, int scan_before)
Packit c32a2d
{
Packit c32a2d
	int err = MPG123_OK;
Packit c32a2d
	mpg123_handle* mh = NULL;
Packit c32a2d
	off_t length, pos;
Packit c32a2d
Packit c32a2d
	mh = mpg123_new(NULL, &err );
Packit c32a2d
	if(mh == NULL) return -1;
Packit c32a2d
Packit c32a2d
	err = mpg123_open(mh, path );
Packit c32a2d
	if(err != MPG123_OK) return -1;
Packit c32a2d
Packit c32a2d
	if(scan_before) mpg123_scan(mh);
Packit c32a2d
Packit c32a2d
	pos = mpg123_seek( mh, 0, SEEK_END);
Packit c32a2d
	if(pos < 0){ error1("seek failed: %s", mpg123_strerror(mh)); return -1; }
Packit c32a2d
Packit c32a2d
	pos = mpg123_tell(mh);
Packit c32a2d
	length = mpg123_length(mh);
Packit c32a2d
Packit c32a2d
	/* Later: Read samples and compare different whence values with identical seek positions. */
Packit c32a2d
Packit c32a2d
	mpg123_close(mh);
Packit c32a2d
	mpg123_delete(mh);
Packit c32a2d
Packit c32a2d
	fprintf(stdout, "length %"OFF_P" vs. pos %"OFF_P"\n", length, pos);
Packit c32a2d
Packit c32a2d
	return (pos == length) ? 0 : -1;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
void print_field(const char *name, mpg123_string *sb)
Packit c32a2d
{
Packit c32a2d
	const unsigned char *sbp = (unsigned char*)sb->p;
Packit c32a2d
	enum mpg123_text_encoding enc;
Packit c32a2d
	mpg123_string printer;
Packit c32a2d
	mpg123_init_string(&printer);
Packit c32a2d
	printf("\n=== %s ===\n", name);
Packit c32a2d
	if(sb->fill == 0)
Packit c32a2d
	{
Packit c32a2d
		printf("Oh, empty. Totally.\n");
Packit c32a2d
		return;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	enc = mpg123_enc_from_id3(sbp[0]);
Packit c32a2d
Packit c32a2d
	printf("From encoding: %i (in ID3: %i)\n", enc, (int)sbp[0]) ;
Packit c32a2d
	if(mpg123_store_utf8(&printer, enc, sbp+1, sb->fill-1))
Packit c32a2d
	{
Packit c32a2d
		/* Not caring for multiple strings separated via null bytes here. */
Packit c32a2d
		printf("Value: %s\n", printer.p);
Packit c32a2d
	}
Packit c32a2d
	else error("Conversion failed!");
Packit c32a2d
	mpg123_free_string(&printer);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
int main(int argc, char **argv)
Packit c32a2d
{
Packit c32a2d
	int err;
Packit c32a2d
	int ret = 0;
Packit c32a2d
	mpg123_handle *mh;
Packit c32a2d
	mpg123_id3v2 *id3;
Packit c32a2d
Packit c32a2d
	if(argc < 2)
Packit c32a2d
	{
Packit c32a2d
		printf("Gimme a MPEG file name...\n");
Packit c32a2d
		return 0;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	mpg123_init();
Packit c32a2d
	mh = mpg123_new(NULL, &err;;
Packit c32a2d
	if(err != MPG123_OK) goto badend;
Packit c32a2d
Packit c32a2d
	mpg123_param(mh, MPG123_ADD_FLAGS, MPG123_PLAIN_ID3TEXT, 0.);
Packit c32a2d
Packit c32a2d
	err = mpg123_open(mh, argv[1]);
Packit c32a2d
	if(err != MPG123_OK) goto badend;
Packit c32a2d
Packit c32a2d
	err = mpg123_scan(mh);
Packit c32a2d
	if(err != MPG123_OK) goto badend;
Packit c32a2d
Packit c32a2d
	err = mpg123_id3(mh, NULL, &id3);
Packit c32a2d
	if(err != MPG123_OK) goto badend;
Packit c32a2d
Packit c32a2d
	if(id3 == NULL)
Packit c32a2d
	{
Packit c32a2d
		error("No ID3 data found.");
Packit c32a2d
		goto badend;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	print_field("artist", id3->artist);
Packit c32a2d
	print_field("title", id3->title);
Packit c32a2d
	print_field("album", id3->album);
Packit c32a2d
	print_field("comment", id3->comment);
Packit c32a2d
Packit c32a2d
	goto end;
Packit c32a2d
badend:
Packit c32a2d
	ret = -1;
Packit c32a2d
end:
Packit c32a2d
	mpg123_delete(mh);
Packit c32a2d
	mpg123_exit();
Packit c32a2d
	return ret;
Packit c32a2d
}