Browse Source

Fixed mp3 playback on linux and added support for mono mp3s

[email protected] 15 years ago
parent
commit
0f54088d06

+ 22 - 11
src/modules/sound/lullaby/Mpg123Decoder.cpp

@@ -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
src/modules/sound/lullaby/Mpg123Decoder.h

@@ -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();