Show SDL errors on player UI

This commit is contained in:
Duilio Protti 2016-06-30 15:00:15 -03:00
parent 9125da6100
commit c6cd6522a6
9 changed files with 113 additions and 52 deletions

View File

@ -21,6 +21,6 @@ libinfinite_la_SOURCES = \
display.c display.h \
effects.c effects.h\
cputest.c cputest.h\
mmx.h types.h
mmx.h music-player.h types.h
EXTRA_DIST = infinite_states

View File

@ -15,6 +15,7 @@
*/
#include <string.h>
#include <libaudcore/drct.h>
#include <libaudcore/interface.h>
#include <libaudcore/playlist.h>
#include <libaudcore/plugin.h>
#include <libaudcore/plugins.h>
@ -166,6 +167,10 @@ static void adjust_volume(gint delta) {
aud_drct_set_volume_main(volume + delta);
}
static void notify_critical_error (const gchar *message) {
aud_ui_show_error(message);
}
static void disable_plugin() {
PluginHandle * plugin = aud_plugin_lookup_basename("libinfinite");
aud_plugin_enable(plugin, false);
@ -181,6 +186,7 @@ static Player player = {
.next = next,
.seek = seek,
.adjust_volume = adjust_volume,
.notify_critical_error = notify_critical_error,
.disable_plugin = disable_plugin
};

View File

@ -16,6 +16,7 @@
#ifndef __INFINITY_COMPUTE__
#define __INFINITY_COMPUTE__
#include <glib.h>
#include "types.h"
#define NB_FCT 7
@ -74,5 +75,4 @@ void compute_generate_vector_field(vector_field_t *vector_field);
byte *compute_surface(t_interpol *vector, gint32 width, gint32 height);
byte *compute_surface_mmx(t_interpol *vector, gint32 width, gint32 height);
#endif /* __INFINITY_COMPUTE__ */

View File

@ -49,17 +49,26 @@ static SDL_Color color_table[NB_PALETTES][256];
static gint16 current_colors[256];
static byte *surface1;
static Player *player;
static void init_sdl(gint32 _width, gint32 _height, gint32 _scale)
static gchar error_msg[256];
static gboolean sdl_init(gint32 _width, gint32 _height, gint32 _scale)
{
if (SDL_Init((Uint32)(SDL_INIT_VIDEO | SDL_INIT_TIMER)) < 0)
g_error("Infinity: Couldn't initialize SDL: %s\n", SDL_GetError());
if (SDL_Init((Uint32)(SDL_INIT_VIDEO | SDL_INIT_TIMER)) < 0) {
g_snprintf(error_msg, 256, "Infinity cannot initialize SDL: %s", SDL_GetError());
player->notify_critical_error(error_msg);
return FALSE;
}
screen = SDL_SetVideoMode(_width * _scale, _height * _scale, 16, VIDEO_FLAGS);
if (screen == NULL)
g_error("Infinity: could not init video mode: %s\n", SDL_GetError());
g_message("Infinity: SDL SetVideoMode() Ok");
if (screen == NULL) {
g_snprintf(error_msg, 256, "Infinity cannot create display: %s", SDL_GetError());
player->notify_critical_error(error_msg);
return FALSE;
}
(void)SDL_ShowCursor(0);
(void)SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
return TRUE;
}
static void generate_colors()
@ -208,19 +217,26 @@ static void line(gint32 x1, gint32 y1, gint32 x2, gint32 y2, gint32 c)
}
}
void display_init(gint32 _width, gint32 _height, gint32 _scale)
gboolean display_init(gint32 _width, gint32 _height, gint32 _scale, Player *_player)
{
gboolean sdl_ok;
width = _width;
height = _height;
scale = _scale;
player = _player;
pcm_data_mutex = SDL_CreateMutex();
compute_init(width, height, scale);
init_sdl(width, height, scale);
sdl_ok = sdl_init(width, height, scale);
generate_colors();
effects_load_effects();
vector_field = compute_vector_field_new(width, height);
compute_generate_vector_field(vector_field);
if (!sdl_ok) {
display_quit();
}
return sdl_ok;
}
void display_quit(void)
@ -234,21 +250,22 @@ void display_quit(void)
SDL_Quit();
}
void display_resize(gint32 _width, gint32 _height)
gboolean display_resize(gint32 _width, gint32 _height)
{
width = _width;
height = _height;
screen = SDL_SetVideoMode(width * scale,
height * scale,
16, VIDEO_FLAGS);
if (screen == NULL)
g_error("Infinity: Couldn't set %dx%d video mode: %s\n",
width * scale, height * scale,
SDL_GetError());
screen = SDL_SetVideoMode(width * scale, height * scale, 16, VIDEO_FLAGS);
if (screen == NULL) {
g_snprintf(error_msg, 256, "Infinity cannot resize display to %dx%d pixels: %s",
width * scale, height * scale, SDL_GetError());
player->notify_critical_error(error_msg);
return FALSE;
}
compute_vector_field_destroy(vector_field);
vector_field = compute_vector_field_new(width, height);
compute_resize(width, height);
compute_generate_vector_field(vector_field);
return TRUE;
}
inline void display_set_pcm_data(const float *data, int channels)

View File

@ -21,19 +21,19 @@
#include "compute.h"
#include "effects.h"
#include "music-player.h"
#define NB_PALETTES 5
/*
* Initializes the display related structures.
* Initializes the display related structures, including the SDL library.
*
* It initializes the module and the SDL library.
* Warning: must be called before any SDL operation and must not be
* called when SDL was already started.
*
* Warning: because this function initializes the SDL
* library, must be called before any SDL operation and
* must not be called when SDL was already started.
* Returns true on success; and false otherwise.
*/
void display_init(gint32 width, gint32 height, gint32 scale);
gboolean display_init(gint32 _width, gint32 _height, gint32 _scale, Player *player);
/*
* Closes the display module.
@ -53,8 +53,10 @@ void display_quit(void);
/*
* Change the size of the display to the new dimension
* width x height.
*
* Returns true on success; and false otherwise.
*/
void display_resize(gint32 width, gint32 height);
gboolean display_resize(gint32 width, gint32 height);
/*
* Set data as the data PCM data of this module.

View File

@ -16,9 +16,8 @@
#ifndef __INFINITY_EFFECTS__
#define __INFINITY_EFFECTS__
#include <types.h>
#include <glib.h>
#include "types.h"
/*
* Represents effect related information.
@ -52,5 +51,4 @@ void effects_save_effect(t_effect *effect);
void effects_load_effects(void);
void effects_load_random_effect(t_effect *effect);
#endif /* __INFINITY_EFFECTS__ */

View File

@ -72,7 +72,7 @@ void infinity_init(InfParameters * _params, Player * _player)
gint32 _try;
if (initializing) {
g_warning("We are already initializing");
g_warning("Infinity: is already initializing...");
_try = 0;
while (initializing) {
g_usleep(1000000);
@ -88,6 +88,14 @@ void infinity_init(InfParameters * _params, Player * _player)
height = params->get_height();
scale = params->get_scale();
if (! display_init(width, height, scale, player)) {
g_critical("Infinity: cannot initialize display");
initializing = FALSE;
finished = TRUE;
player->disable_plugin();
return;
}
old_color = 0;
color = 0;
@ -100,7 +108,6 @@ void infinity_init(InfParameters * _params, Player * _player)
quiting = FALSE;
first_xevent = TRUE;
display_init(width, height, scale);
current_title = g_strdup("Infinity");
set_title();
title_timer = g_timer_new();
@ -214,6 +221,12 @@ static gint disable_func(gpointer data)
return FALSE;
}
static void schedule_exit() {
GDK_THREADS_ENTER();
(void)gtk_idle_add(disable_func, NULL);
GDK_THREADS_LEAVE();
}
static void check_events()
{
SDL_Event event;
@ -268,9 +281,7 @@ static void check_events()
* }
* break;*/
case SDL_QUIT:
GDK_THREADS_ENTER();
(void)gtk_idle_add(disable_func, NULL);
GDK_THREADS_LEAVE();
schedule_exit();
break;
case SDL_VIDEORESIZE:
g_return_if_fail(SDL_LockMutex(resizing_mutex) >= 0);
@ -413,7 +424,10 @@ static int renderer(void *arg)
if (finished)
break;
if (must_resize) {
display_resize(width, height);
if (! display_resize(width, height)) {
schedule_exit();
break;
}
params->set_width(width);
params->set_height(height);
must_resize = FALSE;

View File

@ -17,6 +17,7 @@
#define __INFINITY_INFINITY__
#include <glib.h>
#include "music-player.h"
typedef struct _InfParameters {
gint32 (*get_x_origin) (void);
@ -33,23 +34,6 @@ typedef struct _InfParameters {
gint32 (*get_max_fps) (void);
} InfParameters;
typedef struct _Player {
gboolean (*is_playing) (void);
gchar* (*get_title) (void);
void (*play) (void);
void (*pause) (void);
void (*stop) (void);
void (*previous) (void);
void (*next) (void);
void (*seek) (gint32 usecs);
void (*adjust_volume) (gint delta);
void (*disable_plugin) (void); /* tell the player that this plugin has stopped */
} Player;
/*
* Initializes rendering process.
*

40
src/music-player.h Normal file
View File

@ -0,0 +1,40 @@
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __INFINITY_PLAYER__
#define __INFINITY_PLAYER__
/*
* Interface that Infinity uses to talk with the hosting music player.
*/
typedef struct _Player {
gboolean (*is_playing) (void);
gchar* (*get_title) (void);
void (*play) (void);
void (*pause) (void);
void (*stop) (void);
void (*previous) (void);
void (*next) (void);
void (*seek) (gint32 usecs);
void (*adjust_volume) (gint delta);
void (*notify_critical_error) (const gchar *message);
void (*disable_plugin) (void); /* tell the player that this plugin has stopped */
} Player;
#endif /* __INFINITY_PLAYER__ */