diff options
| author | Lionel Ulmer | 2002-04-27 17:44:57 +0000 | 
|---|---|---|
| committer | Lionel Ulmer | 2002-04-27 17:44:57 +0000 | 
| commit | 62e33695426be04add9a24724918d47206909df1 (patch) | |
| tree | cd50d7ce96090ee1725f3eed8de0976787525a2a | |
| parent | 35ab30657764ed8f4149088bde82628b1b14fe69 (diff) | |
| download | scummvm-rg350-62e33695426be04add9a24724918d47206909df1.tar.gz scummvm-rg350-62e33695426be04add9a24724918d47206909df1.tar.bz2 scummvm-rg350-62e33695426be04add9a24724918d47206909df1.zip  | |
Implemented shaking in the X11 driver the 'easy' way :-)
Added also the possibility to capture the sound played during the
game. To convert to a WAV file, do :
      'sox -r 22050 -w -s -c 2 sound.raw sound.wav'
svn-id: r4113
| -rw-r--r-- | x11.cpp | 30 | 
1 files changed, 27 insertions, 3 deletions
@@ -151,6 +151,7 @@ private:  	int fake_right_mouse;  	int report_presses;  	int current_shake_pos; +	int new_shake_pos;  	struct timeval start_time;  	enum { @@ -179,6 +180,8 @@ typedef struct {  	byte format;  } THREAD_PARAM; +#undef CAPTURE_SOUND +  #define FRAG_SIZE 4096  static void *sound_and_music_thread(void *params)  { @@ -188,6 +191,10 @@ static void *sound_and_music_thread(void *params)  	OSystem::SoundProc *sound_proc = ((THREAD_PARAM *) params)->sound_proc;  	void *proc_param = ((THREAD_PARAM *) params)->param; +#ifdef CAPTURE_SOUND +	FILE *f = fopen("sound.raw", "wb"); +#endif +  	sound_fd = open("/dev/dsp", O_WRONLY);  	audio_buf_info info;  	if (sound_fd < 0) { @@ -248,6 +255,10 @@ static void *sound_and_music_thread(void *params)  		for (int i = ((FRAG_SIZE >> 2) - 1); i >= 0; i--) {  			buf[2 * i + 1] = buf[2 * i] = buf[i];  		} +#ifdef CAPTURE_SOUND +		fwrite(buf, 2, FRAG_SIZE >> 1, f); +		fflush(f); +#endif  		size = FRAG_SIZE;  		while (size > 0) {  			written = write(sound_fd, sound_buffer, size); @@ -299,6 +310,7 @@ OSystem_X11::OSystem_X11()  	fake_right_mouse = 0;  	report_presses = 1;  	current_shake_pos = 0; +	new_shake_pos = 0;  	_palette_changed = false;  	num_of_dirty_square = MAX_NUMBER_OF_DIRTY_SQUARES; @@ -515,13 +527,25 @@ void OSystem_X11::update_screen() {  			update_screen_helper(&(ds[num_of_dirty_square]), &dout);  		}  	} -	if (need_redraw == true) { + +	if (current_shake_pos != new_shake_pos) { +		/* Redraw first the 'black borders' in case of resize */ +		if (current_shake_pos < new_shake_pos) +			XFillRectangle(display, window, black_gc, 0, current_shake_pos, window_width, new_shake_pos); +		else +			XFillRectangle(display, window, black_gc, 0, window_height - current_shake_pos,  +			               window_width, window_height - new_shake_pos); +		XShmPutImage(display, window, DefaultGC(display, screen), image, +		             0, 0, scumm_x, scumm_y + new_shake_pos, +		             320, 200, 0); +		current_shake_pos = new_shake_pos; +	} else if (need_redraw == true) {  #ifdef USE_XV_SCALING  		XvShmPutImage(display, 65, window, DefaultGC(display, screen), image,  			      0, 0, 320, 200, 0, 0, window_width, window_height, 0);  #else  		XShmPutImage(display, window, DefaultGC(display, screen), image, -		             dout.x, dout.y, scumm_x + dout.x, scumm_y + dout.y, +		             dout.x, dout.y, scumm_x + dout.x, scumm_y + dout.y + current_shake_pos,  		             dout.w - dout.x, dout.h - dout.y, 0);  #endif  		XFlush(display); @@ -659,7 +683,7 @@ void OSystem_X11::set_mouse_cursor(const byte *buf, uint w, uint h, int hotspot_  }  void OSystem_X11::set_shake_pos(int shake_pos) { -	warning("Shaking not implemented yet (%d) ", shake_pos); +	new_shake_pos = shake_pos;  }  void *OSystem_X11::create_thread(ThreadProc *proc, void *param) {  | 
