player_control: allocate getPlayerErrorStr() result

This lets us eliminate the static fixed-size buffer.
This commit is contained in:
Max Kellermann 2009-10-08 20:45:38 +02:00
parent a5960c20cc
commit 128a5fa4a5
3 changed files with 23 additions and 21 deletions

View File

@ -454,6 +454,7 @@ handle_status(struct client *client,
{
const char *state = NULL;
int updateJobId;
char *error;
int song;
switch (getPlayerState()) {
@ -515,10 +516,12 @@ handle_status(struct client *client,
updateJobId);
}
if (getPlayerError() != PLAYER_ERROR_NOERROR) {
error = getPlayerErrorStr();
if (error != NULL) {
client_printf(client,
COMMAND_STATUS_ERROR ": %s\n",
getPlayerErrorStr());
error);
g_free(error);
}
song = playlist_get_next_song(&g_playlist);

View File

@ -167,46 +167,40 @@ pc_errored_song_uri(void)
char *getPlayerErrorStr(void)
{
/* static OK here, only one user in main task */
static char error[MPD_PATH_MAX + 64]; /* still too much */
static const size_t errorlen = sizeof(error);
char *error;
char *uri;
*error = '\0'; /* likely */
switch (pc.error) {
case PLAYER_ERROR_NOERROR:
break;
return NULL;
case PLAYER_ERROR_FILENOTFOUND:
uri = pc_errored_song_uri();
snprintf(error, errorlen,
"file \"%s\" does not exist or is inaccessible", uri);
error = g_strdup_printf("file \"%s\" does not exist or is inaccessible", uri);
g_free(uri);
break;
return error;
case PLAYER_ERROR_FILE:
uri = pc_errored_song_uri();
snprintf(error, errorlen, "problems decoding \"%s\"", uri);
error = g_strdup_printf("problems decoding \"%s\"", uri);
g_free(uri);
break;
return error;
case PLAYER_ERROR_AUDIO:
strcpy(error, "problems opening audio device");
break;
return g_strdup("problems opening audio device");
case PLAYER_ERROR_SYSTEM:
strcpy(error, "system error occured");
break;
return g_strdup("system error occured");
case PLAYER_ERROR_UNKTYPE:
uri = pc_errored_song_uri();
snprintf(error, errorlen,
"file type of \"%s\" is unknown", uri);
error = g_strdup_printf("file type of \"%s\" is unknown", uri);
g_free(uri);
break;
return error;
}
return *error ? error : NULL;
assert(false);
return NULL;
}
void

View File

@ -122,6 +122,11 @@ enum player_state getPlayerState(void);
void clearPlayerError(void);
/**
* Returns the human-readable message describing the last error during
* playback, NULL if no error occurred. The caller has to free the
* returned string.
*/
char *getPlayerErrorStr(void);
enum player_error getPlayerError(void);