Fixed mp3 playback on linux and added support for mono mp3s

This commit is contained in:
bart@bartbes.ath.cx
2010-02-24 21:35:19 +01:00
parent 6aa103c72c
commit 0f54088d06
2 changed files with 28 additions and 15 deletions
+22 -11
View File
@@ -1,14 +1,14 @@
/** /**
* Copyright (c) 2006-2010 LOVE Development Team * Copyright (c) 2006-2010 LOVE Development Team
* *
* This software is provided 'as-is', without any express or implied * This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages * warranty. In no event will the authors be held liable for any damages
* arising from the use of this software. * arising from the use of this software.
* *
* Permission is granted to anyone to use this software for any purpose, * Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it * including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions: * freely, subject to the following restrictions:
* *
* 1. The origin of this software must not be misrepresented; you must not * 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software * claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be * in a product, an acknowledgment in the product documentation would be
@@ -34,7 +34,7 @@ namespace lullaby
bool Mpg123Decoder::inited = false; bool Mpg123Decoder::inited = false;
Mpg123Decoder::Mpg123Decoder(Data * data, const std::string & ext, int bufferSize, int sampleRate) Mpg123Decoder::Mpg123Decoder(Data * data, const std::string & ext, int bufferSize, int sampleRate)
: Decoder(data, ext, bufferSize, sampleRate), handle(0) : Decoder(data, ext, bufferSize, sampleRate), channels(MPG123_STEREO), handle(0)
{ {
data_size = data->getSize(); data_size = data->getSize();
@@ -57,9 +57,6 @@ namespace lullaby
ret = mpg123_open_feed(handle); ret = mpg123_open_feed(handle);
if (ret != MPG123_OK) if (ret != MPG123_OK)
throw love::Exception("Could not open feed."); throw love::Exception("Could not open feed.");
ret = mpg123_format(handle, sampleRate, MPG123_STEREO, MPG123_ENC_SIGNED_16);
if (ret != MPG123_OK)
throw love::Exception("Could not set output format.");
ret = feed(16384); ret = feed(16384);
@@ -70,7 +67,7 @@ namespace lullaby
Mpg123Decoder::~Mpg123Decoder() Mpg123Decoder::~Mpg123Decoder()
{ {
mpg123_close(handle); mpg123_close(handle);
} }
bool Mpg123Decoder::accepts(const std::string & ext) bool Mpg123Decoder::accepts(const std::string & ext)
@@ -113,6 +110,20 @@ namespace lullaby
switch(r) switch(r)
{ {
case MPG123_NEW_FORMAT: case MPG123_NEW_FORMAT:
{
long rate = 0;
int encoding = 0;
int ret = mpg123_getformat(handle, &rate, &channels, &encoding);
if (rate == 0)
rate = sampleRate;
if (channels == 0)
channels = MPG123_STEREO;
if (encoding == 0)
encoding = MPG123_ENC_SIGNED_16;
ret = mpg123_format(handle, rate, channels, encoding);
if (ret != MPG123_OK)
throw love::Exception("Could not set output format.");
}
continue; continue;
case MPG123_NEED_MORE: case MPG123_NEED_MORE:
{ {
@@ -136,7 +147,7 @@ namespace lullaby
size += numbytes; size += numbytes;
continue; continue;
case MPG123_DONE: case MPG123_DONE:
// Apparently, mpg123_read does not return MPG123_DONE, but // Apparently, mpg123_read does not return MPG123_DONE, but
// let's keep it here anyway. // let's keep it here anyway.
eof = true; eof = true;
default: default:
@@ -144,7 +155,7 @@ namespace lullaby
break; break;
} }
} }
return size; return size;
} }
@@ -186,7 +197,7 @@ namespace lullaby
int Mpg123Decoder::getChannels() const int Mpg123Decoder::getChannels() const
{ {
return 2; return channels;
} }
int Mpg123Decoder::getBits() const int Mpg123Decoder::getBits() const
+6 -4
View File
@@ -1,14 +1,14 @@
/** /**
* Copyright (c) 2006-2010 LOVE Development Team * Copyright (c) 2006-2010 LOVE Development Team
* *
* This software is provided 'as-is', without any express or implied * This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages * warranty. In no event will the authors be held liable for any damages
* arising from the use of this software. * arising from the use of this software.
* *
* Permission is granted to anyone to use this software for any purpose, * Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it * including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions: * freely, subject to the following restrictions:
* *
* 1. The origin of this software must not be misrepresented; you must not * 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software * claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be * in a product, an acknowledgment in the product documentation would be
@@ -48,11 +48,13 @@ namespace lullaby
int data_offset; int data_offset;
int data_size; int data_size;
int channels;
public: public:
Mpg123Decoder(Data * data, const std::string & ext, int bufferSize, int sampleRate); Mpg123Decoder(Data * data, const std::string & ext, int bufferSize, int sampleRate);
virtual ~Mpg123Decoder(); virtual ~Mpg123Decoder();
static bool accepts(const std::string & ext); static bool accepts(const std::string & ext);
static void quit(); static void quit();