looper/subprojects/mpg123/src/tests/decode_fixed.c
2024-09-28 10:31:18 -07:00

63 lines
1.6 KiB
C

#include "../compat/compat.h"
#include <mpg123.h>
#include "../common/debug.h"
int work(mpg123_handle *mh, int ch, int enc)
{
int16_t buffer[16348];
long rate;
int channels, encoding;
if(mpg123_getformat(mh, &rate, &channels, &encoding) != MPG123_OK)
return 1;
if(channels != ch || encoding != enc)
{
error("channel/encoding mismatch");
return 1;
}
fprintf(stderr, "openend fixed track with %ld %d %d\n"
, rate, channels, encoding );
int ret;
size_t done;
while( (ret=mpg123_read(mh, buffer, sizeof(buffer), &done)) == MPG123_OK)
{
if(!done)
continue;
fprintf(stderr, "Got first sample %d and last sample %d out of %zu\n"
, buffer[0], buffer[done/sizeof(*buffer)-1], done/sizeof(*buffer) );
INT123_unintr_write(STDOUT_FILENO, buffer, done);
}
if(ret != MPG123_DONE)
{
merror( "wrong mpg123_read() return value %d (%s, %s)"
, ret, mpg123_plain_strerror(ret), mpg123_strerror(mh) );
return 1;
} else
return 0;
}
int main(int argc, char **argv)
{
int ret = 1;
int enc = MPG123_ENC_SIGNED_16;
if(!mpg123_feature2(MPG123_FEATURE_OUTPUT_16BIT))
{
error("Libmpg123 doesn't do 16 bit output, cannot test.");
return 1;
}
if(argc < 2)
{
printf("Gimme a MPEG file name...\n");
return 0;
}
// Intentionally no error checking here. Let's see how the lib deals with it.
mpg123_handle *mh = mpg123_new(NULL, NULL);
// Try to set decoder to generic to avoid memory sanitizer freaking out about
// asssembly synth routines.
mpg123_decoder(mh, "generic");
// Let's fix it to mono.
if(mpg123_open_fixed(mh, argv[1], MPG123_MONO, enc) == MPG123_OK)
ret = work(mh, 1, enc);
mpg123_delete(mh);
return ret;
}