I tried playing an FLV with nellymoser audio, only to discover that Gnash segfaults. It's nothing to do with decoding, but rather the core continues to use an AudioDecoder that failed to find a suitable codec and cannot decode anything.
There is a simple fix for it in MediaHandler.h (return a 0 pointer if setup fails). A better way (I think) is to drop setup as an AudioDecoder member and pass the AudioInfo or SoundInfo straight to the constructor. Fatal errors can throw a MediaException in the constructor and a try / catch ensures that objects with such fatal errors are never constructed. I implemented the same with VideoDecoder (for exactly the same bug) a few weeks ago. My question is: is it too close to a release (when is the release going to be?) to make this interface change? Bastiaan's work on gstreamer would probably be affected most, but on the other hand it is less work to improve the interface now than to implement a temporary one and then change it later. Plus it's a bugfix and not a new feature :) I've attached a rough patch of my proposed change. It could be improved by throwing directly in void setup() methods when an error is encountered, so that MediaException::what() gives an exact error description. Any comments? (Also whether it is an improvement over the current interface or not). bwy > > For samples of FLV with nellymoser audio, see: > > http://samples.mplayerhq.hu/A-codecs/Nelly_Moser/ > > Loading these into Gnash (e.g with file #14418 - easyvideo.swf) causes a > segfault. > > If ffmpeg supports nellymoser decoding, I suggest dropping Gnash's homespun > decoder; if people want nellymoser, they will have to get a recent version of > ffmpeg. > > The immediate problem is to fix the crash, though. > > > > > _______________________________________________________ > > Reply to this item at: > > <http://savannah.gnu.org/bugs/?24355> > > _______________________________________________ > Message sent via/by Savannah > http://savannah.gnu.org/ >
=== modified file 'libcore/asobj/NetStreamFfmpeg.cpp'
--- libcore/asobj/NetStreamFfmpeg.cpp 2008-09-17 07:16:12 +0000
+++ libcore/asobj/NetStreamFfmpeg.cpp 2008-09-23 11:26:49 +0000
@@ -215,7 +215,7 @@
_videoDecoder = _mediaHandler->createVideoDecoder(*videoInfo);
}
catch (MediaException& e) {
- log_error("Could not create Video decoder: %s", e.what());
+ log_error("NetStream: Could not create Video decoder: %s", e.what());
}
}
@@ -234,9 +234,13 @@
assert ( _mediaHandler ); // caller should check this
- _audioDecoder = _mediaHandler->createAudioDecoder(*audioInfo);
- if ( ! _audioDecoder.get() )
- log_error(_("Could not create audio decoder for codec %d"), audioInfo->codec);
+ try {
+ _audioDecoder = _mediaHandler->createAudioDecoder(*audioInfo);
+ }
+ catch (MediaException& e) {
+ log_error("Could not create Video decoder: %s", e.what());
+ }
+
}
=== modified file 'libmedia/AudioDecoder.h'
--- libmedia/AudioDecoder.h 2008-06-20 07:18:01 +0000
+++ libmedia/AudioDecoder.h 2008-09-23 11:25:54 +0000
@@ -37,33 +37,12 @@
class AudioDecoder {
public:
+
AudioDecoder() {}
// virtual classes need a virtual destructor !
virtual ~AudioDecoder() {}
- /// Sets up the decoder.
- //
- /// @param info
- /// AudioInfo class with all the info needed to decode
- /// the sound correctly.
- ///
- /// @return true if succesfull else false
- ///
- /// TODO: take AudioInfo by ref, not pointer
- ///
- virtual bool setup(AudioInfo* /*info*/) { return false; }
-
- /// Sets up the decoder.
- //
- /// @param info
- /// SoundInfo class with all the info needed to decode
- /// the audio correctly.
- ///
- /// @return true if succesfull else false
- ///
- virtual bool setup(SoundInfo* /*info*/) { return false; }
-
/// Decodes a frame and returns a pointer to the data
//
/// @param input
=== modified file 'libmedia/AudioDecoderNellymoser.cpp'
--- libmedia/AudioDecoderNellymoser.cpp 2008-03-29 02:07:07 +0000
+++ libmedia/AudioDecoderNellymoser.cpp 2008-09-23 11:16:29 +0000
@@ -745,35 +745,46 @@
delete nh;
}
-AudioDecoderNellymoser::AudioDecoderNellymoser ()
- :
- _sampleRate(0),
- _stereo(false)
-{
- _nh = nelly_get_handle();
-}
+AudioDecoderNellymoser::AudioDecoderNellymoser(AudioInfo& info)
+ :
+ _sampleRate(0),
+ _stereo(false)
+{
+ setup(info);
+ _nh = nelly_get_handle();
+}
+
+AudioDecoderNellymoser::AudioDecoderNellymoser(SoundInfo& info)
+ :
+ _sampleRate(0),
+ _stereo(false)
+{
+ setup(info);
+ _nh = nelly_get_handle();
+}
+
AudioDecoderNellymoser::~AudioDecoderNellymoser()
{
nelly_free_handle(_nh);
}
-bool AudioDecoderNellymoser::setup(SoundInfo* info)
+bool AudioDecoderNellymoser::setup(SoundInfo& info)
{
- if (info->getFormat() == AUDIO_CODEC_NELLYMOSER || info->getFormat() == AUDIO_CODEC_NELLYMOSER_8HZ_MONO) {
- _sampleRate = info->getSampleRate();
- _stereo = info->isStereo();
+ if (info.getFormat() == AUDIO_CODEC_NELLYMOSER || info.getFormat() == AUDIO_CODEC_NELLYMOSER_8HZ_MONO) {
+ _sampleRate = info.getSampleRate();
+ _stereo = info.isStereo();
return true;
} else {
return false;
}
}
-bool AudioDecoderNellymoser::setup(AudioInfo* info)
+bool AudioDecoderNellymoser::setup(AudioInfo& info)
{
- if (info->type == FLASH && (info->codec == AUDIO_CODEC_NELLYMOSER || info->codec == AUDIO_CODEC_NELLYMOSER_8HZ_MONO)) {
- _sampleRate = info->sampleRate;
- _stereo = info->stereo;
+ if (info.type == FLASH && (info.codec == AUDIO_CODEC_NELLYMOSER || info.codec == AUDIO_CODEC_NELLYMOSER_8HZ_MONO)) {
+ _sampleRate = info.sampleRate;
+ _stereo = info.stereo;
return true;
} else {
return false;
=== modified file 'libmedia/AudioDecoderNellymoser.h'
--- libmedia/AudioDecoderNellymoser.h 2008-06-03 11:39:51 +0000
+++ libmedia/AudioDecoderNellymoser.h 2008-09-23 11:19:46 +0000
@@ -44,8 +44,8 @@
* DEALINGS IN THE SOFTWARE.
*/
-#ifndef __AUDIODECODERNELLYMOSER_H__
-#define __AUDIODECODERNELLYMOSER_H__
+#ifndef GNASH_AUDIODECODERNELLYMOSER_H
+#define GNASH_AUDIODECODERNELLYMOSER_H
#include "log.h"
#include "AudioDecoder.h"
@@ -78,11 +78,20 @@
class AudioDecoderNellymoser : public AudioDecoder {
public:
- AudioDecoderNellymoser();
- ~AudioDecoderNellymoser();
-
- bool setup(AudioInfo* info);
- bool setup(SoundInfo* info);
+
+ /// @param info
+ /// AudioInfo class with all the info needed to decode
+ /// the sound correctly. Throws a MediaException on fatal
+ /// error.
+ AudioDecoderNellymoser(AudioInfo& info);
+
+ /// @param info
+ /// SoundInfo class with all the info needed to decode
+ /// the sound correctly. Throws a MediaException on fatal
+ /// error.
+ AudioDecoderNellymoser(SoundInfo& info);
+
+ ~AudioDecoderNellymoser();
boost::uint8_t* decode(boost::uint8_t* input, boost::uint32_t inputSize, boost::uint32_t& outputSize, boost::uint32_t& decodedBytes, bool parse);
@@ -91,6 +100,9 @@
private:
+ bool setup(AudioInfo& info);
+ bool setup(SoundInfo& info);
+
// The handle used by the decoder
nelly_handle* _nh;
=== modified file 'libmedia/AudioDecoderSimple.cpp'
--- libmedia/AudioDecoderSimple.cpp 2008-05-19 12:03:52 +0000
+++ libmedia/AudioDecoderSimple.cpp 2008-09-23 11:24:07 +0000
@@ -276,40 +276,51 @@
}
-AudioDecoderSimple::AudioDecoderSimple ()
- :
- _sampleRate(0),
- _sampleCount(0),
- _stereo(false),
- _is16bit(true)
-{
-}
+AudioDecoderSimple::AudioDecoderSimple(AudioInfo& info)
+ :
+ _sampleRate(0),
+ _sampleCount(0),
+ _stereo(false),
+ _is16bit(true)
+{
+ if (!setup(info)) throw MediaException("Failed to setup decoder");
+}
+
+AudioDecoderSimple::AudioDecoderSimple(SoundInfo& info)
+ :
+ _sampleRate(0),
+ _sampleCount(0),
+ _stereo(false),
+ _is16bit(true)
+{
+ if (!setup(info)) throw MediaException("Failed to setup decoder");
+}
+
AudioDecoderSimple::~AudioDecoderSimple()
{
-
}
-bool AudioDecoderSimple::setup(SoundInfo* info)
+bool AudioDecoderSimple::setup(SoundInfo& info)
{
- if (info->getFormat() == AUDIO_CODEC_ADPCM || info->getFormat() == AUDIO_CODEC_RAW || info->getFormat() == AUDIO_CODEC_UNCOMPRESSED) {
- _codec = info->getFormat();
- _sampleRate = info->getSampleRate();
- _sampleCount = info->getSampleCount();
- _stereo = info->isStereo();
- _is16bit = info->is16bit();
+ if (info.getFormat() == AUDIO_CODEC_ADPCM || info.getFormat() == AUDIO_CODEC_RAW || info.getFormat() == AUDIO_CODEC_UNCOMPRESSED) {
+ _codec = info.getFormat();
+ _sampleRate = info.getSampleRate();
+ _sampleCount = info.getSampleCount();
+ _stereo = info.isStereo();
+ _is16bit = info.is16bit();
return true;
}
return false;
}
-bool AudioDecoderSimple::setup(AudioInfo* info)
+bool AudioDecoderSimple::setup(AudioInfo& info)
{
- if (info->type == FLASH && (info->codec == AUDIO_CODEC_ADPCM || info->codec == AUDIO_CODEC_RAW || info->codec == AUDIO_CODEC_UNCOMPRESSED)) {
- _codec = static_cast<audioCodecType>(info->codec);
- _sampleRate = info->sampleRate;
- _stereo = info->stereo;
+ if (info.type == FLASH && (info.codec == AUDIO_CODEC_ADPCM || info.codec == AUDIO_CODEC_RAW || info.codec == AUDIO_CODEC_UNCOMPRESSED)) {
+ _codec = static_cast<audioCodecType>(info.codec);
+ _sampleRate = info.sampleRate;
+ _stereo = info.stereo;
_is16bit = true; // Fix this?
return true;
} else {
=== modified file 'libmedia/AudioDecoderSimple.h'
--- libmedia/AudioDecoderSimple.h 2008-03-05 03:55:48 +0000
+++ libmedia/AudioDecoderSimple.h 2008-09-23 11:12:06 +0000
@@ -17,8 +17,8 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-#ifndef __AUDIODECODERSIMPLE_H__
-#define __AUDIODECODERSIMPLE_H__
+#ifndef GNASH_AUDIODECODERSIMPLE_H
+#define GNASH_AUDIODECODERSIMPLE_H
#include "log.h"
#include "AudioDecoder.h"
@@ -34,17 +34,19 @@
class AudioDecoderSimple : public AudioDecoder {
public:
- AudioDecoderSimple();
+ AudioDecoderSimple(AudioInfo& info);
+ AudioDecoderSimple(SoundInfo& info);
+
~AudioDecoderSimple();
- bool setup(AudioInfo* info);
-
- bool setup(SoundInfo* info);
-
boost::uint8_t* decode(boost::uint8_t* input, boost::uint32_t inputSize, boost::uint32_t& outputSize, boost::uint32_t& decodedBytes, bool parse);
private:
+ bool setup(AudioInfo& info);
+
+ bool setup(SoundInfo& info);
+
// codec
audioCodecType _codec;
=== modified file 'libmedia/ffmpeg/AudioDecoderFfmpeg.cpp'
--- libmedia/ffmpeg/AudioDecoderFfmpeg.cpp 2008-06-25 21:34:19 +0000
+++ libmedia/ffmpeg/AudioDecoderFfmpeg.cpp 2008-09-23 11:13:06 +0000
@@ -35,12 +35,23 @@
namespace gnash {
namespace media {
-AudioDecoderFfmpeg::AudioDecoderFfmpeg ()
- :
- _audioCodec(NULL),
- _audioCodecCtx(NULL),
- _parser(NULL)
-{}
+AudioDecoderFfmpeg::AudioDecoderFfmpeg(AudioInfo& info)
+ :
+ _audioCodec(NULL),
+ _audioCodecCtx(NULL),
+ _parser(NULL)
+{
+ if (!setup(info)) throw MediaException("Failed to create decoder");
+}
+
+AudioDecoderFfmpeg::AudioDecoderFfmpeg(SoundInfo& info)
+ :
+ _audioCodec(NULL),
+ _audioCodecCtx(NULL),
+ _parser(NULL)
+{
+ if (!setup(info)) throw MediaException("Failed to create decoder");
+}
AudioDecoderFfmpeg::~AudioDecoderFfmpeg()
{
@@ -52,7 +63,7 @@
if (_parser) av_parser_close(_parser);
}
-bool AudioDecoderFfmpeg::setup(SoundInfo* info)
+bool AudioDecoderFfmpeg::setup(SoundInfo& info)
{
// Init the avdecoder-decoder
avcodec_init();
@@ -60,7 +71,7 @@
enum CodecID codec_id;
- switch(info->getFormat()) {
+ switch(info.getFormat()) {
case AUDIO_CODEC_RAW:
codec_id = CODEC_ID_PCM_U16LE;
break;
@@ -78,7 +89,7 @@
}
break;
default:
- log_error(_("Unsupported audio codec %d"), static_cast<int>(info->getFormat()));
+ log_error(_("Unsupported audio codec %d"), static_cast<int>(info.getFormat()));
return false;
}
_audioCodec = avcodec_find_decoder(codec_id);
@@ -104,15 +115,15 @@
}
if (_audioCodecCtx->codec->id != CODEC_ID_MP3) {
- _audioCodecCtx->channels = (info->isStereo() ? 2 : 1);
- _audioCodecCtx->sample_rate = info->getSampleRate();
+ _audioCodecCtx->channels = (info.isStereo() ? 2 : 1);
+ _audioCodecCtx->sample_rate = info.getSampleRate();
_audioCodecCtx->sample_fmt = SAMPLE_FMT_S16;
}
return true;
}
-bool AudioDecoderFfmpeg::setup(AudioInfo* info)
+bool AudioDecoderFfmpeg::setup(AudioInfo& info)
{
// Init the avdecoder-decoder
avcodec_init();
@@ -120,14 +131,14 @@
enum CodecID codec_id = CODEC_ID_NONE;
- if (info->type == FFMPEG)
+ if (info.type == FFMPEG)
{
- codec_id = static_cast<CodecID>(info->codec);
+ codec_id = static_cast<CodecID>(info.codec);
}
- else if (info->type == FLASH)
+ else if (info.type == FLASH)
{
- switch(info->codec)
+ switch(info.codec)
{
case AUDIO_CODEC_RAW:
codec_id = CODEC_ID_PCM_U16LE;
@@ -139,13 +150,15 @@
codec_id = CODEC_ID_MP3;
break;
default:
- log_error(_("Unsupported audio codec %d"), static_cast<int>(info->codec));
+ log_error(_("Unsupported audio codec %d"),
+ static_cast<int>(info.codec));
return false;
}
}
else
{
- log_error("AudioDecoderFfmpeg::setup: unknown codec type %d ( should never happen )", info->type);
+ log_error("AudioDecoderFfmpeg::setup: unknown codec type %d "
+ "(should never happen)", info.type);
return false;
}
@@ -157,7 +170,7 @@
}
// Init the parser
- _parser = av_parser_init(static_cast<CodecID>(info->codec));
+ _parser = av_parser_init(static_cast<CodecID>(info.codec));
// Create an audioCodecCtx from the ffmpeg parser if exists/possible
_audioCodecCtx = avcodec_alloc_context();
@@ -166,10 +179,10 @@
return false;
}
- if ( info->extra.get() )
+ if ( info.extra.get() )
{
- assert(dynamic_cast<ExtraAudioInfoFfmpeg*>(info->extra.get()));
- const ExtraAudioInfoFfmpeg& ei = static_cast<ExtraAudioInfoFfmpeg&>(*info->extra);
+ assert(dynamic_cast<ExtraAudioInfoFfmpeg*>(info.extra.get()));
+ const ExtraAudioInfoFfmpeg& ei = static_cast<ExtraAudioInfoFfmpeg&>(*info.extra);
_audioCodecCtx->extradata = ei.data;
_audioCodecCtx->extradata_size = ei.dataSize;
}
@@ -179,14 +192,15 @@
//avcodec_close(_audioCodecCtx);
av_free(_audioCodecCtx);
_audioCodecCtx = 0;
- log_error(_("AudioDecoderFfmpeg::setup: avcodec_open: failed to initialize FFMPEG codec %s (%d)"),
- _audioCodec->name, (int)codec_id);
+ log_error(_("AudioDecoderFfmpeg::setup: avcodec_open: "
+ "failed to initialize FFMPEG codec %s (%d)"),
+ _audioCodec->name, (int)codec_id);
return false;
}
if (_audioCodecCtx->codec->id != CODEC_ID_MP3) {
- _audioCodecCtx->channels = (info->stereo ? 2 : 1);
- _audioCodecCtx->sample_rate = info->sampleRate;
+ _audioCodecCtx->channels = (info.stereo ? 2 : 1);
+ _audioCodecCtx->sample_rate = info.sampleRate;
_audioCodecCtx->sample_fmt = SAMPLE_FMT_S16; // was commented out, why ?
}
=== modified file 'libmedia/ffmpeg/AudioDecoderFfmpeg.h'
--- libmedia/ffmpeg/AudioDecoderFfmpeg.h 2008-09-22 16:56:45 +0000
+++ libmedia/ffmpeg/AudioDecoderFfmpeg.h 2008-09-23 11:12:17 +0000
@@ -17,8 +17,8 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-#ifndef __AUDIODECODERFFMPEG_H__
-#define __AUDIODECODERFFMPEG_H__
+#ifndef GNASH_AUDIODECODERFFMPEG_H
+#define GNASH_AUDIODECODERFFMPEG_H
// TODO: What's this for ?
#ifndef __STDC_CONSTANT_MACROS
@@ -36,18 +36,19 @@
class AudioDecoderFfmpeg : public AudioDecoder {
public:
- AudioDecoderFfmpeg();
+ AudioDecoderFfmpeg(AudioInfo& info);
+ AudioDecoderFfmpeg(SoundInfo& info);
~AudioDecoderFfmpeg();
- bool setup(AudioInfo* info);
- bool setup(SoundInfo* info);
-
boost::uint8_t* decode(boost::uint8_t* input, boost::uint32_t inputSize, boost::uint32_t& outputSize, boost::uint32_t& decodedBytes, bool parse);
boost::uint8_t* decode(const EncodedAudioFrame& af, boost::uint32_t& outputSize);
private:
+ bool setup(AudioInfo& info);
+ bool setup(SoundInfo& info);
+
boost::uint8_t* decodeFrame(boost::uint8_t* input, boost::uint32_t inputSize, boost::uint32_t& outputSize);
AVCodec* _audioCodec;
=== modified file 'libmedia/ffmpeg/MediaHandlerFfmpeg.cpp'
--- libmedia/ffmpeg/MediaHandlerFfmpeg.cpp 2008-06-09 13:31:51 +0000
+++ libmedia/ffmpeg/MediaHandlerFfmpeg.cpp 2008-09-23 10:34:10 +0000
@@ -48,7 +48,8 @@
}
catch (GnashException& ex)
{
- log_error("Could not create FFMPEG based media parser for input stream: %s", ex.what());
+ log_error("Could not create FFMPEG based media parser for "
+ "input stream: %s", ex.what());
assert(!parser.get());
}
}
@@ -59,15 +60,14 @@
std::auto_ptr<VideoDecoder>
MediaHandlerFfmpeg::createVideoDecoder(VideoInfo& info)
{
- std::auto_ptr<VideoDecoder> ret( new VideoDecoderFfmpeg(info) );
+ std::auto_ptr<VideoDecoder> ret(new VideoDecoderFfmpeg(info));
return ret;
}
std::auto_ptr<AudioDecoder>
MediaHandlerFfmpeg::createAudioDecoder(AudioInfo& info)
{
- std::auto_ptr<AudioDecoder> ret( new AudioDecoderFfmpeg() );
- ret->setup(&info);
+ std::auto_ptr<AudioDecoder> ret(new AudioDecoderFfmpeg(info));
return ret;
}
=== modified file 'libmedia/ffmpeg/MediaHandlerFfmpeg.h'
--- libmedia/ffmpeg/MediaHandlerFfmpeg.h 2008-06-09 13:31:51 +0000
+++ libmedia/ffmpeg/MediaHandlerFfmpeg.h 2008-09-23 11:18:22 +0000
@@ -17,8 +17,8 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-#ifndef __MEDIAHANDLERFFMPEG_H__
-#define __MEDIAHANDLERFFMPEG_H__
+#ifndef GNASH_MEDIAHANDLERFFMPEG_H
+#define GNASH_MEDIAHANDLERFFMPEG_H
#ifdef HAVE_CONFIG_H
#include "gnashconfig.h"
@@ -46,4 +46,4 @@
} // gnash.media namespace
} // namespace gnash
-#endif // __MEDIAHANDLERFFMPEG_H__
+#endif
=== modified file 'libmedia/ffmpeg/sound_handler_sdl.cpp'
--- libmedia/ffmpeg/sound_handler_sdl.cpp 2008-09-15 14:17:20 +0000
+++ libmedia/ffmpeg/sound_handler_sdl.cpp 2008-09-23 11:29:14 +0000
@@ -284,54 +284,40 @@
sound->decoder = NULL;
- switch (sounddata->soundinfo->getFormat()) {
- case AUDIO_CODEC_NELLYMOSER:
- case AUDIO_CODEC_NELLYMOSER_8HZ_MONO:
- sound->decoder = new AudioDecoderNellymoser();
-
- if (!sound->decoder->setup(sounddata->soundinfo.get())) {
- log_error("The audio decoder can't decode the audio");
- delete sound->decoder;
- sound->decoder = NULL;
- }
-
- break;
- case AUDIO_CODEC_MP3:
+ try {
+
+ switch (sounddata->soundinfo->getFormat()) {
+ case AUDIO_CODEC_NELLYMOSER:
+ case AUDIO_CODEC_NELLYMOSER_8HZ_MONO:
+ sound->decoder = new AudioDecoderNellymoser(*(sounddata->soundinfo));
+ break;
+ case AUDIO_CODEC_MP3:
#ifdef USE_MAD
- sound->decoder = new AudioDecoderMad();
-
- if (!sound->decoder->setup(sounddata->soundinfo.get())) {
- log_error("The audio decoder can't decode the audio");
- delete sound->decoder;
- sound->decoder = NULL;
- }
-
- break;
+ sound->decoder = new AudioDecoderMad();
+
+ if (!sound->decoder->setup(sounddata->soundinfo.get())) {
+ log_error("The audio decoder can't decode the audio");
+ delete sound->decoder;
+ sound->decoder = NULL;
+ }
+
+ break;
#endif
#ifdef USE_FFMPEG
- sound->decoder = new AudioDecoderFfmpeg();
-
- if (!sound->decoder->setup(sounddata->soundinfo.get())) {
- log_error("The audio decoder can't decode the audio");
- delete sound->decoder;
- sound->decoder = NULL;
- }
-
- break;
+ sound->decoder = new AudioDecoderFfmpeg(*(sounddata->soundinfo));
+ break;
#endif
- case AUDIO_CODEC_ADPCM:
- default:
-
- sound->decoder = new AudioDecoderSimple();
-
- if (!sound->decoder->setup(sounddata->soundinfo.get())) {
- log_error("The audio decoder can't decode the audio");
- delete sound->decoder;
- sound->decoder = NULL;
- }
-
- }
-
+ case AUDIO_CODEC_ADPCM:
+ default:
+ sound->decoder = new AudioDecoderSimple(*(sounddata->soundinfo));
+ break;
+ }
+ }
+ catch (MediaException& e)
+ {
+ log_error("AudioDecoder initialization failed");
+ }
+
if (!soundOpened) {
if (SDL_OpenAudio(&audioSpec, NULL) < 0 ) {
log_error(_("Unable to start SDL sound: %s"), SDL_GetError());
signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil
_______________________________________________ Gnash-dev mailing list [email protected] http://lists.gnu.org/mailman/listinfo/gnash-dev

