shout_mp3: call lame_close() in clear_encoder() method
The shout_mp3 encoder had two bugs: when no song was ever played, MPD segfaulted during cleanup. Second bug: memory leak, each time the shout device was opened, lame_init() was called again, and lame_close() is only called once during shutdown. Fix this by shutting down LAME each time the clear_encoder() method is called.
This commit is contained in:
parent
1fdf25214f
commit
3b0a78fe0d
1
NEWS
1
NEWS
@ -43,6 +43,7 @@ ver 0.14.2 (2009/??/??)
|
|||||||
- jack: allocate ring buffers before connecting
|
- jack: allocate ring buffers before connecting
|
||||||
- jack: clear "shutdown" flag on reconnect
|
- jack: clear "shutdown" flag on reconnect
|
||||||
- jack: reduced sleep time to 1ms
|
- jack: reduced sleep time to 1ms
|
||||||
|
- shout: fixed memory leak in the mp3 encoder
|
||||||
* mapper: remove trailing slashes from music_directory
|
* mapper: remove trailing slashes from music_directory
|
||||||
* player: set player error when output device fails
|
* player: set player error when output device fails
|
||||||
|
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
#include "shout_plugin.h"
|
#include "shout_plugin.h"
|
||||||
|
|
||||||
#include <lame/lame.h>
|
#include <lame/lame.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
struct lame_data {
|
struct lame_data {
|
||||||
@ -45,6 +47,9 @@ static int shout_mp3_encoder_clear_encoder(struct shout_data *sd)
|
|||||||
buf->len)) < 0)
|
buf->len)) < 0)
|
||||||
g_warning("error flushing lame buffers\n");
|
g_warning("error flushing lame buffers\n");
|
||||||
|
|
||||||
|
lame_close(ld->gfp);
|
||||||
|
ld->gfp = NULL;
|
||||||
|
|
||||||
return (ret > 0);
|
return (ret > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,8 +57,7 @@ static void shout_mp3_encoder_finish(struct shout_data *sd)
|
|||||||
{
|
{
|
||||||
struct lame_data *ld = (struct lame_data *)sd->encoder_data;
|
struct lame_data *ld = (struct lame_data *)sd->encoder_data;
|
||||||
|
|
||||||
lame_close(ld->gfp);
|
assert(ld->gfp == NULL);
|
||||||
ld->gfp = NULL;
|
|
||||||
|
|
||||||
g_free(ld);
|
g_free(ld);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user