diff options
-rw-r--r-- | uisimulator/common/stubs.c | 57 | ||||
-rw-r--r-- | uisimulator/sdl/lcd-bitmap.c | 20 | ||||
-rw-r--r-- | uisimulator/sdl/lcd-charcell.c | 16 | ||||
-rw-r--r-- | uisimulator/sdl/lcd-remote.c | 12 | ||||
-rw-r--r-- | uisimulator/sdl/sound.c | 216 | ||||
-rw-r--r-- | uisimulator/sdl/uisdl.c | 19 | ||||
-rw-r--r-- | uisimulator/sdl/uisdl.h | 11 | ||||
-rw-r--r-- | uisimulator/win32/lcd-win32.c | 15 | ||||
-rw-r--r-- | uisimulator/win32/sound.c | 46 | ||||
-rw-r--r-- | uisimulator/x11/lcd-x11.c | 16 | ||||
-rw-r--r-- | uisimulator/x11/sound.c | 45 |
11 files changed, 327 insertions, 146 deletions
diff --git a/uisimulator/common/stubs.c b/uisimulator/common/stubs.c index d4862a0f85..b06c812772 100644 --- a/uisimulator/common/stubs.c +++ b/uisimulator/common/stubs.c @@ -32,49 +32,6 @@ #include "ata.h" /* for volume definitions */ extern char having_new_lcd; -static bool playing = false; - -/* Stubs for PCM audio playback. */ -bool pcm_is_playing(void) -{ - return playing; -} - -void pcm_mute(bool state) -{ - (void)state; -} - -void pcm_play_pause(bool state) -{ - (void)state; -} - -bool pcm_is_paused(void) -{ - return false; -} - -void pcm_play_stop(void) -{ - playing = false; -} - -void pcm_init(void) -{ -} - -void (*sound_get_pcm)(unsigned char** start, long* size); -void pcm_play_data(void (*get_more)(unsigned char** start, long* size)) -{ - sound_get_pcm = get_more; - playing = true; -} - -long pcm_get_bytes_waiting(void) -{ - return 0; -} #if CONFIG_CODEC != SWCODEC void audio_set_buffer_margin(int seconds) @@ -83,20 +40,6 @@ void audio_set_buffer_margin(int seconds) } #endif -#ifdef CONFIG_BACKLIGHT -void sim_backlight(int value) -{ - DEBUGF("backlight: %s\n", (value > 0) ? "on" : "off"); -} -#endif - -#ifdef HAVE_REMOTE_LCD -void sim_remote_backlight(int value) -{ - DEBUGF("remote backlight: %s\n", (value > 0) ? "on" : "off"); -} -#endif - int fat_startsector(void) { return 63; diff --git a/uisimulator/sdl/lcd-bitmap.c b/uisimulator/sdl/lcd-bitmap.c index db4a98d823..2fd7576ecc 100644 --- a/uisimulator/sdl/lcd-bitmap.c +++ b/uisimulator/sdl/lcd-bitmap.c @@ -17,13 +17,15 @@ * ****************************************************************************/ +#include "debug.h" #include "uisdl.h" #include "lcd-sdl.h" SDL_Surface* lcd_surface; #if LCD_DEPTH <= 8 -SDL_Color lcd_color_zero = {UI_LCD_BGCOLORLIGHT, 0}; +SDL_Color lcd_color_zero = {UI_LCD_BGCOLOR, 0}; +SDL_Color lcd_backlight_color_zero = {UI_LCD_BGCOLORLIGHT, 0}; SDL_Color lcd_color_max = {0, 0, 0, 0}; #endif @@ -60,6 +62,22 @@ void lcd_update_rect(int x_start, int y_start, int width, int height) get_lcd_pixel); } +#ifdef CONFIG_BACKLIGHT +void sim_backlight(int value) +{ +#if LCD_DEPTH <= 8 + if (value > 0) { + sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, &lcd_color_max, (1<<LCD_DEPTH)); + } else { + sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, (1<<LCD_DEPTH)); + } + + lcd_update(); +#else + DEBUGF("backlight: %s\n", (value > 0) ? "on" : "off"); +#endif +} +#endif /* initialise simulator lcd driver */ void sim_lcd_init(void) diff --git a/uisimulator/sdl/lcd-charcell.c b/uisimulator/sdl/lcd-charcell.c index 5f51e44810..2ef86d0baf 100644 --- a/uisimulator/sdl/lcd-charcell.c +++ b/uisimulator/sdl/lcd-charcell.c @@ -23,7 +23,8 @@ #include "lcd-sdl.h" SDL_Surface* lcd_surface; -SDL_Color lcd_color_zero = {UI_LCD_BGCOLORLIGHT, 0}; +SDL_Color lcd_color_zero = {UI_LCD_BGCOLOR, 0}; +SDL_Color lcd_backlight_color_zero = {UI_LCD_BGCOLORLIGHT, 0}; SDL_Color lcd_color_max = {0, 0, 0, 0}; /* Defined in lcd-playersim.c */ @@ -104,6 +105,19 @@ void drawrectangles(int color, struct rectangle *points, int count) SDL_UnlockSurface(lcd_surface); } +#ifdef CONFIG_BACKLIGHT +void sim_backlight(int value) +{ + if (value > 0) { + sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, &lcd_color_max, (1<<LCD_DEPTH)); + } else { + sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, (1<<LCD_DEPTH)); + } + + lcd_update(); +} +#endif + /* initialise simulator lcd driver */ void sim_lcd_init(void) { diff --git a/uisimulator/sdl/lcd-remote.c b/uisimulator/sdl/lcd-remote.c index b5a07d2f20..5ce0447601 100644 --- a/uisimulator/sdl/lcd-remote.c +++ b/uisimulator/sdl/lcd-remote.c @@ -23,7 +23,8 @@ SDL_Surface *remote_surface; -SDL_Color remote_color_zero = {UI_REMOTE_BGCOLORLIGHT, 0}; +SDL_Color remote_color_zero = {UI_REMOTE_BGCOLOR, 0}; +SDL_Color remote_backlight_color_zero = {UI_REMOTE_BGCOLORLIGHT, 0}; SDL_Color remote_color_max = {0, 0, 0, 0}; extern unsigned char lcd_remote_framebuffer[LCD_REMOTE_HEIGHT/8][LCD_REMOTE_WIDTH]; @@ -44,6 +45,15 @@ void lcd_remote_update_rect(int x_start, int y_start, int width, int height) (background ? UI_REMOTE_POSY : LCD_HEIGHT), get_lcd_remote_pixel); } +void sim_remote_backlight(int value) +{ + if (value > 0) { + sdl_set_gradient(remote_surface, &remote_backlight_color_zero, &remote_color_max, (1<<LCD_REMOTE_DEPTH)); + } else { + sdl_set_gradient(remote_surface, &remote_color_zero, &remote_color_max, (1<<LCD_REMOTE_DEPTH)); + } +} + /* initialise simulator lcd remote driver */ void sim_lcd_remote_init(void) { diff --git a/uisimulator/sdl/sound.c b/uisimulator/sdl/sound.c index 66df6961b2..4b8427ca90 100644 --- a/uisimulator/sdl/sound.c +++ b/uisimulator/sdl/sound.c @@ -21,88 +21,170 @@ #ifdef ROCKBOX_HAS_SIMSOUND /* play sound in sim enabled */ -#include <memory.h> #include <stdlib.h> -#include "uisdl.h" +#include <stdbool.h> +#include <memory.h> #include "sound.h" +#include "SDL.h" + +static bool pcm_playing; +static bool pcm_paused; -static int audio_len; -static char *audio_pos; -SDL_sem* sem; +static Uint8* pcm_data; +static int pcm_data_size; -void mixaudio(void *udata, Uint8 *stream, int len) +static void sdl_dma_start(const void *addr, size_t size) { - (void)udata; - - /* Only play if we have data left */ - if ( audio_len == 0 ) - return; - - len = (len > audio_len) ? audio_len : len; - memcpy(stream, audio_pos, len); - audio_pos += len; - audio_len -= len; - - if(audio_len == 0) { - if(SDL_SemPost(sem)) - fprintf(stderr,"Couldn't post: %s",SDL_GetError()); - - } + pcm_playing = true; + + pcm_data = (Uint8 *) addr; + pcm_data_size = size; + + SDL_PauseAudio(0); } -int sim_sound_init(void) +static void sdl_dma_stop() { - SDL_AudioSpec fmt; - - /* Set 16-bit stereo audio at 44Khz */ - fmt.freq = 44100; - fmt.format = AUDIO_S16SYS; - fmt.channels = 2; - fmt.samples = 512; /* A good value for games */ - fmt.callback = mixaudio; - fmt.userdata = NULL; - - sem = SDL_CreateSemaphore(0); - - /* Open the audio device and start playing sound! */ - if(SDL_OpenAudio(&fmt, NULL) < 0) { - fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); - return -1; - } - - SDL_PauseAudio(0); - return 0; + pcm_playing = false; + + SDL_PauseAudio(1); + + pcm_paused = false; } -int sound_playback_thread(void *p) +static void (*callback_for_more)(unsigned char**, size_t*) = NULL; +void pcm_play_data(void (*get_more)(unsigned char** start, size_t* size), + unsigned char* start, size_t size) { - int sndret = sim_sound_init(); - unsigned char *buf; - long size; + callback_for_more = get_more; + + if (!(start && size)) { + if (get_more) + get_more(&start, &size); + else + return; + } + + if (start && size) { + sdl_dma_start(start, size); + } +} - (void)p; +size_t pcm_get_bytes_waiting(void) +{ + return pcm_data_size; +} - while(sndret) - SDL_Delay(100000); /* wait forever, can't play sound! */ +void pcm_mute(bool mute) +{ + (void) mute; +} + +void pcm_play_stop(void) +{ + if (pcm_playing) { + sdl_dma_stop(); + } +} + +void pcm_play_pause(bool play) +{ + int next_size; + Uint8 *next_start; + + if (!pcm_playing) { + return; + } + + if(pcm_paused && play) { + if (pcm_get_bytes_waiting()) { + printf("unpause\n"); + + SDL_PauseAudio(0); + } else { + printf("unpause, no data waiting\n"); + + void (*get_more)(unsigned char**, size_t*) = callback_for_more; + + if (get_more) { + get_more(&next_start, &next_size); + } + + if (next_start && next_size) { + sdl_dma_start(next_start, next_size); + } else { + sdl_dma_stop(); + printf("unpause attempted, no data\n"); + } + } + } else if(!pcm_paused && !play) { + printf("pause\n"); + + SDL_PauseAudio(1); + } + + pcm_paused = !play; +} + +bool pcm_is_paused(void) +{ + return pcm_paused; +} + +bool pcm_is_playing(void) +{ + return pcm_playing; +} + +void sdl_audio_callback(void *udata, Uint8 *stream, int len) +{ + int datalen; + + (void) udata; + + if (pcm_data_size == 0) { + return; + } + + datalen = (len > pcm_data_size) ? pcm_data_size : len; + + memcpy(stream, pcm_data, datalen); + + pcm_data_size -= datalen; + pcm_data += datalen; + + if (pcm_data_size == 0) { + void (*get_more)(unsigned char**, size_t*) = callback_for_more; + if (get_more) { + get_more(&pcm_data, &pcm_data_size); + } else { + pcm_data_size = 0; + pcm_data = NULL; + } + } +} + +int pcm_init(void) +{ + SDL_AudioSpec fmt; + + /* Set 16-bit stereo audio at 44Khz */ + fmt.freq = 44100; + fmt.format = AUDIO_S16SYS; + fmt.channels = 2; + fmt.samples = 512; + fmt.callback = sdl_audio_callback; + fmt.userdata = NULL; + + /* Open the audio device and start playing sound! */ + if(SDL_OpenAudio(&fmt, NULL) < 0) { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + return -1; + } - do { - while(!sound_get_pcm) - /* TODO: fix a fine thread-synch mechanism here */ - SDL_Delay(100); - do { - sound_get_pcm(&buf, &size); - if(!size) { - sound_get_pcm = NULL; - break; - } - audio_pos = buf; // TODO: is this safe? - audio_len = size; - - if(SDL_SemWait(sem)) - fprintf(stderr,"Couldn't wait: %s",SDL_GetError()); - } while(size); - } while(1); + sdl_dma_stop(); + return 0; } #endif /* ROCKBOX_HAS_SIMSOUND */ diff --git a/uisimulator/sdl/uisdl.c b/uisimulator/sdl/uisdl.c index 178090403f..1e36bfa223 100644 --- a/uisimulator/sdl/uisdl.c +++ b/uisimulator/sdl/uisdl.c @@ -23,7 +23,6 @@ #include "button.h" #include "thread.h" #include "kernel.h" -#include "sound.h" #include "uisdl.h" #include "lcd-sdl.h" #ifdef HAVE_LCD_BITMAP @@ -50,9 +49,6 @@ bool background = false; /* Don't use backgrounds by default */ SDL_Thread *gui_thread; SDL_TimerID tick_timer_id; -#ifdef ROCKBOX_HAS_SIMSOUND -SDL_Thread *sound_thread; -#endif bool lcd_display_redraw = true; /* Used for player simulator */ char having_new_lcd=true; /* Used for player simulator */ @@ -68,8 +64,7 @@ Uint32 tick_timer(Uint32 interval, void *param) new_tick = (SDL_GetTicks() - start_tick) * HZ / 1000; - if (new_tick != current_tick) - { + if (new_tick != current_tick) { long i; for (i = new_tick - current_tick; i > 0; i--) sim_tick_tasks(); @@ -171,9 +166,6 @@ bool gui_shutdown() SDL_KillThread(gui_thread); SDL_RemoveTimer(tick_timer_id); -#ifdef ROCKBOX_HAS_SIMSOUND - SDL_KillThread(sound_thread); -#endif for (i = 0; i < threadCount; i++) { @@ -223,7 +215,6 @@ int main(int argc, char *argv[]) background = false; } - if (!gui_startup()) return -1; @@ -235,14 +226,6 @@ int main(int argc, char *argv[]) tick_timer_id = SDL_AddTimer(10, tick_timer, NULL); -#ifdef ROCKBOX_HAS_SIMSOUND - sound_thread = SDL_CreateThread(sound_playback_thread, NULL); - if (sound_thread == NULL) { - printf("Error creating sound thread!\n"); - return -1; - } -#endif - gui_message_loop(); return gui_shutdown(); diff --git a/uisimulator/sdl/uisdl.h b/uisimulator/sdl/uisdl.h index 989ca364d1..f4a28f9e0f 100644 --- a/uisimulator/sdl/uisdl.h +++ b/uisimulator/sdl/uisdl.h @@ -139,6 +139,16 @@ #define UI_LCD_WIDTH 176 #define UI_LCD_HEIGHT 132 +#elif defined(IPOD_VIDEO) +#define UI_TITLE "iPod Video" +#define UI_WIDTH 320 // width of GUI window +#define UI_HEIGHT 240 // height of GUI window +/* high-colour */ +#define UI_LCD_POSX 0 // x position of lcd +#define UI_LCD_POSY 0 // y position of lcd +#define UI_LCD_WIDTH 320 +#define UI_LCD_HEIGHT 240 + #elif defined(ARCHOS_GMINI120) #define UI_TITLE "Gmini 120" #define UI_WIDTH 370 // width of GUI window @@ -151,7 +161,6 @@ #define UI_LCD_WIDTH 192 // * 1.5 #define UI_LCD_HEIGHT 96 // * 1.5 - #elif defined(IAUDIO_X5) #define UI_TITLE "iAudio X5" #define UI_WIDTH 300 // width of GUI window diff --git a/uisimulator/win32/lcd-win32.c b/uisimulator/win32/lcd-win32.c index a50fbd11f6..8afd025a16 100644 --- a/uisimulator/win32/lcd-win32.c +++ b/uisimulator/win32/lcd-win32.c @@ -22,6 +22,7 @@ #include "uisw32.h" #include "lcd.h" #include "lcd-playersim.h" +#include "debug.h" #if LCD_DEPTH == 16 unsigned short bitmap[LCD_HEIGHT][LCD_WIDTH]; /* the ui display */ @@ -309,3 +310,17 @@ void simlcdinit(void) #endif } +#ifdef CONFIG_BACKLIGHT +void sim_backlight(int value) +{ + DEBUGF("backlight: %s\n", (value > 0) ? "on" : "off"); +} +#endif + +#ifdef HAVE_REMOTE_LCD +void sim_remote_backlight(int value) +{ + DEBUGF("remote backlight: %s\n", (value > 0) ? "on" : "off"); +} +#endif + diff --git a/uisimulator/win32/sound.c b/uisimulator/win32/sound.c index 02a5a888d9..54140f59e4 100644 --- a/uisimulator/win32/sound.c +++ b/uisimulator/win32/sound.c @@ -33,6 +33,8 @@ #include "thread-win32.h" #include "debug.h" +static bool playing = false; + void pcm_play_stop(void); static void sound_play_chunk(HWAVEOUT wave_out, LPWAVEHDR header, @@ -152,4 +154,48 @@ void sound_playback_thread(void) } } + +/* Stubs for PCM audio playback. */ +bool pcm_is_playing(void) +{ + return playing; +} + +void pcm_mute(bool state) +{ + (void)state; +} + +void pcm_play_pause(bool state) +{ + (void)state; +} + +bool pcm_is_paused(void) +{ + return false; +} + +void pcm_play_stop(void) +{ + playing = false; +} + +void pcm_init(void) +{ +} + +void (*sound_get_pcm)(unsigned char** start, long* size); +void pcm_play_data(void (*get_more)(unsigned char** start, long* size)) +{ + sound_get_pcm = get_more; + playing = true; +} + +long pcm_get_bytes_waiting(void) +{ + return 0; +} + + #endif /* ROCKBOX_HAS_SIMSOUND */ diff --git a/uisimulator/x11/lcd-x11.c b/uisimulator/x11/lcd-x11.c index 0a3b40e163..c85848c18b 100644 --- a/uisimulator/x11/lcd-x11.c +++ b/uisimulator/x11/lcd-x11.c @@ -32,6 +32,7 @@ #include "screenhack.h" #include "config.h" +#include "debug.h" /* * Specific implementations for X11, using the generic LCD API and data. @@ -244,3 +245,18 @@ void lcd_update (void) } #endif + +#ifdef CONFIG_BACKLIGHT +void sim_backlight(int value) +{ + DEBUGF("backlight: %s\n", (value > 0) ? "on" : "off"); +} +#endif + +#ifdef HAVE_REMOTE_LCD +void sim_remote_backlight(int value) +{ + DEBUGF("remote backlight: %s\n", (value > 0) ? "on" : "off"); +} +#endif + diff --git a/uisimulator/x11/sound.c b/uisimulator/x11/sound.c index dd875e41f5..06d9c014ff 100644 --- a/uisimulator/x11/sound.c +++ b/uisimulator/x11/sound.c @@ -21,6 +21,7 @@ #ifdef ROCKBOX_HAS_SIMSOUND /* play sound in sim enabled */ +#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -31,6 +32,8 @@ #include "sound.h" +static bool playing = false; + int sim_sound_init(void) { int fd; @@ -92,4 +95,46 @@ void sound_playback_thread(void) } +/* Stubs for PCM audio playback. */ +bool pcm_is_playing(void) +{ + return playing; +} + +void pcm_mute(bool state) +{ + (void)state; +} + +void pcm_play_pause(bool state) +{ + (void)state; +} + +bool pcm_is_paused(void) +{ + return false; +} + +void pcm_play_stop(void) +{ + playing = false; +} + +void pcm_init(void) +{ +} + +void (*sound_get_pcm)(unsigned char** start, long* size); +void pcm_play_data(void (*get_more)(unsigned char** start, long* size)) +{ + sound_get_pcm = get_more; + playing = true; +} + +long pcm_get_bytes_waiting(void) +{ + return 0; +} + #endif /* ROCKBOX_HAS_SIMSOUND */ |