Commit 67a4ca2d authored by Stefan Westerfeld's avatar Stefan Westerfeld

Started to implement mp3 file reading based on libmpg123.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 7181bb40
......@@ -17,6 +17,16 @@ AC_DEFUN([AC_SNDFILE_REQUIREMENTS],
AC_SUBST(SNDFILE_LIBS)
])
dnl
dnl libmpg123
dnl
AC_DEFUN([AC_LIBMPG123_REQUIREMENTS],
[
PKG_CHECK_MODULES(LIBMPG123, [libmpg123])
AC_SUBST(LIBMPG123_CFLAGS)
AC_SUBST(LIBMPG123_LIBS)
])
dnl
dnl zita resampler
dnl
......@@ -57,6 +67,7 @@ AC_DEFUN([AC_FFTW_CHECK],
])
AC_SNDFILE_REQUIREMENTS
AC_LIBMPG123_REQUIREMENTS
AC_ZITA_REQUIREMENTS
AC_FFTW_CHECK
AM_PATH_LIBGCRYPT
......
bin_PROGRAMS = audiowmark
COMMON_SRC = utils.hh utils.cc convcode.hh convcode.cc random.hh random.cc
COMMON_SRC = utils.hh utils.cc convcode.hh convcode.cc random.hh random.cc mp3.cc wavdata.cc wavdata.hh
COMMON_LIBS = $(SNDFILE_LIBS) $(FFTW_LIBS) $(LIBGCRYPT_LIBS) $(LIBMPG123_LIBS)
audiowmark_SOURCES = audiowmark.cc wavdata.cc wavdata.hh fft.cc fft.hh $(COMMON_SRC)
audiowmark_LDFLAGS = $(SNDFILE_LIBS) $(FFTW_LIBS) $(LIBGCRYPT_LIBS)
audiowmark_SOURCES = audiowmark.cc fft.cc fft.hh $(COMMON_SRC)
audiowmark_LDFLAGS = $(COMMON_LIBS)
noinst_PROGRAMS = testconvcode testrandom
noinst_PROGRAMS = testconvcode testrandom testmp3
testconvcode_SOURCES = testconvcode.cc $(COMMON_SRC)
testconvcode_LDFLAGS = $(LIBGCRYPT_LIBS)
testconvcode_LDFLAGS = $(COMMON_LIBS)
testrandom_SOURCES = testrandom.cc $(COMMON_SRC)
testrandom_LDFLAGS = $(LIBGCRYPT_LIBS)
testrandom_LDFLAGS = $(COMMON_LIBS)
testmp3_SOURCES = testmp3.cc $(COMMON_SRC)
testmp3_LDFLAGS = $(COMMON_LIBS)
#include "mp3.hh"
#include <mpg123.h>
#include <assert.h>
#include <stdio.h>
#include <vector>
using std::vector;
using std::string;
bool
mp3_try_load (const string& filename, WavData& wav_data)
{
int err = mpg123_init();
assert (err == MPG123_OK);
mpg123_handle *mh = mpg123_new (NULL, &err);
assert (err == MPG123_OK);
mpg123_param (mh, MPG123_ADD_FLAGS, MPG123_QUIET, 0);
long rate;
int channels;
int encoding;
//
const long *rates;
size_t rate_count;
mpg123_format_none (mh);
mpg123_rates(&rates, &rate_count);
for(size_t i=0; i<rate_count; ++i)
{
err = mpg123_format (mh, rates[i], MPG123_MONO|MPG123_STEREO, MPG123_ENC_FLOAT_32);
assert (err == 0);
}
printf ("# format: %d\n", err);
err = mpg123_open (mh, filename.c_str());
assert (err == 0);
err = mpg123_getformat (mh, &rate, &channels, &encoding);
assert (err == 0);
printf ("# %d\n", err);
printf ("# %ld %d %d\n", rate, channels, encoding);
assert (err == MPG123_OK);
/* ensure that the format will not change */
mpg123_format_none (mh);
mpg123_format (mh, rate, channels, encoding);
printf ("# %zd\n", mpg123_outblock (mh));
vector<unsigned char> buffer (mpg123_outblock (mh));
size_t done = 0;
do
{
err = mpg123_read( mh, &buffer[0], buffer.size(), &done );
assert (err == 0 || err == MPG123_DONE);
printf ("# done=%zd err=%d\n", done, err);
float *f = reinterpret_cast<float *> (&buffer[0]);
for (int i = 0; i < buffer.size() / 8; i++)
{
printf ("%f\n", f[i*2]);
}
}
while (done);
return true;
}
#include "mp3.hh"
int
main (int argc, char **argv)
{
WavData wd;
mp3_try_load (argv[1], wd);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment