[hatari-devel] New recording dialog |
[ Thread Index | Date Index | More lists.tuxfamily.org/hatari-devel Archives ]
Hi,As discussed before release, I've worked on splitting video and audio recording to their own "Recording" options dialog. See attached patches and screenshots. It seems to work fine, and fixes couple of minor bugs
I noticed while testing it. If there are no comments before next week, I'll push these.Note: Suggestions for dialog layout changes are best done as ASCII version of the whole suggested layout.
- Eero
From 67c14ad96f884902e9d2d0c0d9eac3b16418edec Mon Sep 17 00:00:00 2001 From: Eero Tamminen <oak@xxxxxxxxxxxxxx> Date: Fri, 5 Sep 2025 00:17:14 +0300 Subject: [PATCH 2/2] Fix GUI text when recording fails to start Ancient GUI bugs of not checking for startup errors. Fixes: 26c09cbf2 Fixes: 836d7dee2 --- src/gui-sdl/dlgRecord.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gui-sdl/dlgRecord.c b/src/gui-sdl/dlgRecord.c index db312e34..91072c24 100644 --- a/src/gui-sdl/dlgRecord.c +++ b/src/gui-sdl/dlgRecord.c @@ -205,7 +205,8 @@ void Dialog_RecordingDlg(void) if (!File_QueryOverwrite(selname)) break; Str_Copy(ConfigureParams.Video.AviRecordFile, selname, sizeof(ConfigureParams.Video.AviRecordFile)); - Avi_StartRecording_WithConfig (); + if (!Avi_StartRecording_WithConfig ()) + break; recorddlg[DLGRECORD_RECVIDEO].txt = VIDEO_STOP; } break; @@ -228,8 +229,10 @@ void Dialog_RecordingDlg(void) { strcpy(ConfigureParams.Sound.szYMCaptureFileName, DEFAULT_AUDIO_FILE); } - recorddlg[DLGRECORD_RECAUDIO].txt = AUDIO_STOP; - Sound_BeginRecording(ConfigureParams.Sound.szYMCaptureFileName); + if (Sound_BeginRecording(ConfigureParams.Sound.szYMCaptureFileName)) + { + recorddlg[DLGRECORD_RECAUDIO].txt = AUDIO_STOP; + } } break; } -- 2.39.5
From 8d5c95fd8f6b9bab391cfea043a7580bbbac0dad Mon Sep 17 00:00:00 2001 From: Eero Tamminen <oak@xxxxxxxxxxxxxx> Date: Thu, 4 Sep 2025 02:14:20 +0300 Subject: [PATCH 1/2] Move video+audio recording options to their own dialog Grouping them together seems more logical, and leaves more space to arrange Hatari window and audio dialog layouts better. --- src/gui-sdl/CMakeLists.txt | 4 +- src/gui-sdl/dlgMain.c | 39 +++--- src/gui-sdl/dlgRecord.c | 244 +++++++++++++++++++++++++++++++++++++ src/gui-sdl/dlgScreen.c | 181 +++------------------------ src/gui-sdl/dlgSound.c | 57 +-------- src/includes/dialog.h | 1 + 6 files changed, 289 insertions(+), 237 deletions(-) create mode 100644 src/gui-sdl/dlgRecord.c diff --git a/src/gui-sdl/CMakeLists.txt b/src/gui-sdl/CMakeLists.txt index 4f822ba0..db217ab6 100644 --- a/src/gui-sdl/CMakeLists.txt +++ b/src/gui-sdl/CMakeLists.txt @@ -8,8 +8,8 @@ endif() add_library(GuiSdl dlgAbout.c dlgAlert.c dlgCpu.c dlgDevice.c dlgFileSelect.c dlgFloppy.c dlgHalt.c dlgHardDisk.c dlgJoystick.c dlgKeyboard.c dlgMain.c - dlgMemory.c dlgNewDisk.c dlgRom.c dlgScreen.c dlgSound.c dlgSystem.c - sdlgui.c + dlgMemory.c dlgNewDisk.c dlgRecord.c dlgRom.c dlgScreen.c + dlgSound.c dlgSystem.c sdlgui.c ) target_link_libraries(GuiSdl PRIVATE ${SDL2_LIBRARIES}) diff --git a/src/gui-sdl/dlgMain.c b/src/gui-sdl/dlgMain.c index f45e4508..df2bce8e 100644 --- a/src/gui-sdl/dlgMain.c +++ b/src/gui-sdl/dlgMain.c @@ -27,20 +27,21 @@ const char DlgMain_fileid[] = "Hatari dlgMain.c"; #define MAINDLG_KEYBD 11 #define MAINDLG_DEVICES 12 #define MAINDLG_SOUND 13 -#define MAINDLG_ABOUT 14 -#define MAINDLG_LOADCFG 15 -#define MAINDLG_SAVECFG 16 -#define MAINDLG_NORESET 17 -#define MAINDLG_RESET 18 -#define MAINDLG_OK 19 -#define MAINDLG_QUIT 20 -#define MAINDLG_CANCEL 21 +#define MAINDLG_RECORD 14 +#define MAINDLG_ABOUT 15 +#define MAINDLG_LOADCFG 16 +#define MAINDLG_SAVECFG 17 +#define MAINDLG_NORESET 18 +#define MAINDLG_RESET 19 +#define MAINDLG_OK 20 +#define MAINDLG_QUIT 21 +#define MAINDLG_CANCEL 22 /* The main dialog: */ static SGOBJ maindlg[] = { - { SGBOX, 0, 0, 0,0, 50,19, NULL }, + { SGBOX, 0, 0, 0,0, 50,21, NULL }, { SGTEXT, 0, 0, 17,1, 16,1, "Hatari main menu" }, { SGBUTTON, 0, 0, 2, 4, 13,1, "S_ystem" }, { SGBUTTON, 0, 0, 2, 6, 13,1, "CP_U" }, @@ -54,14 +55,15 @@ static SGOBJ maindlg[] = { SGBUTTON, 0, 0, 35, 6, 13,1, "_Keyboard" }, { SGBUTTON, 0, 0, 35, 8, 13,1, "D_evices" }, { SGBUTTON, 0, 0, 35,10, 13,1, "S_ound" }, - { SGBUTTON, 0, 0, 2,13, 13,1, "A_bout" }, - { SGBUTTON, 0, 0, 17,13, 16,1, "_Load config" }, - { SGBUTTON, 0, 0, 35,13, 13,1, "_Save config" }, - { SGRADIOBUT, 0, 0, 3,15, 10,1, "_No Reset" }, - { SGRADIOBUT, 0, 0, 3,17, 15,1, "Reset ma_chine" }, - { SGBUTTON, SG_DEFAULT, 0, 21,15, 8,3, "OK" }, - { SGBUTTON, 0, 0, 36,15, 10,1, "_Quit" }, - { SGBUTTON, SG_CANCEL, 0, 36,17, 10,1, "Cancel" }, + { SGBUTTON, 0, 0, 35,12, 13,1, "Recordin_g" }, + { SGBUTTON, 0, 0, 2,15, 13,1, "A_bout" }, + { SGBUTTON, 0, 0, 17,15, 16,1, "_Load config" }, + { SGBUTTON, 0, 0, 35,15, 13,1, "_Save config" }, + { SGRADIOBUT, 0, 0, 3,17, 10,1, "_No Reset" }, + { SGRADIOBUT, 0, 0, 3,19, 15,1, "Reset ma_chine" }, + { SGBUTTON, SG_DEFAULT, 0, 21,17, 8,3, "OK" }, + { SGBUTTON, 0, 0, 36,17, 10,1, "_Quit" }, + { SGBUTTON, SG_CANCEL, 0, 36,19, 10,1, "Cancel" }, { SGSTOP, 0, 0, 0,0, 0,0, NULL } }; @@ -141,6 +143,9 @@ int Dialog_MainDlg(bool *bReset, bool *bLoadedSnapshot) case MAINDLG_SOUND: Dialog_SoundDlg(); break; + case MAINDLG_RECORD: + Dialog_RecordingDlg(); + break; case MAINDLG_LOADCFG: psNewCfg = SDLGui_FileSelect("Load configuration:", sConfigFileName, NULL, false); if (psNewCfg) diff --git a/src/gui-sdl/dlgRecord.c b/src/gui-sdl/dlgRecord.c new file mode 100644 index 00000000..db312e34 --- /dev/null +++ b/src/gui-sdl/dlgRecord.c @@ -0,0 +1,244 @@ +/* + Hatari - dlgRecord.c + + This file is distributed under the GNU General Public License, version 2 + or at your option any later version. Read the file gpl.txt for details. + + Hatari screenshot, video and audio recording dialog. +*/ +const char DlgRecord_fileid[] = "Hatari dlgRecord.c"; + +#include <assert.h> +#include "main.h" +#include "configuration.h" +#include "dialog.h" +#include "sdlgui.h" +#include "screen.h" +#include "statusbar.h" +#include "screenSnapShot.h" +#include "avi_record.h" +#include "sound.h" +#include "str.h" +#include "file.h" + +/* video object indexes */ +#define DLGRECORD_CAPTURE 3 +#define DLGRECORD_FORMAT_PNG 4 +#define DLGRECORD_FORMAT_BMP 5 +#define DLGRECORD_FORMAT_NEO 6 +#define DLGRECORD_FORMAT_XIMG 7 +#define DLGRECORD_CAPTURE_DIR 8 +#define DLGRECORD_RECVIDEO 10 +#define DLGRECORD_CROP 11 +/* audio object indexes */ +#define DLGRECORD_RECBROWSE 13 +#define DLGRECORD_AUDIONAME 14 +#define DLGRECORD_RECAUDIO 15 +/* exit */ +#define DLGRECORD_EXIT_RECORD 16 + +/* path names shown in the dialog */ +#define MAX_PATH_LEN 28 +static char dlgShotDir[MAX_PATH_LEN+1]; +static char dlgAudioName[MAX_PATH_LEN+1]; + +/* Recording dialog: */ +static SGOBJ recorddlg[] = +{ + { SGBOX, 0, 0, 0,0, 52,19, NULL }, + { SGTEXT, 0, 0, 6,1, 18,1, "Recording options" }, + { SGBOX, 0, 0, 1,3, 50,7, NULL }, + { SGBUTTON, 0, 0, 4,4, 14,1, "_Screenshot" }, + { SGRADIOBUT, 0, 0, 21,4, 5,1, "_PNG" }, + { SGRADIOBUT, 0, 0, 27,4, 5,1, "_BMP" }, + { SGRADIOBUT, 0, 0, 33,4, 5,1, "_NEO" }, + { SGRADIOBUT, 0, 0, 39,4, 5,1, "_XIMG" }, + { SGBUTTON, 0, 0, 4,6, 14,1, "Directory:" }, + { SGTEXT, 0, 0, 21,6, MAX_PATH_LEN,1, dlgShotDir }, + { SGBUTTON, 0, 0, 4,8, 14,1, NULL }, /* text set later, see below */ + { SGCHECKBOX, 0, 0, 21,8, 16,1, "_Crop statusbar" }, + + { SGBOX, 0,0, 1,11, 50,5, NULL }, + { SGBUTTON, 0,0, 4,12, 14,1, "_File name:" }, + { SGTEXT, 0,0, 21,12, MAX_PATH_LEN,1, dlgAudioName }, + { SGBUTTON, 0,0, 17,14, 20,1, NULL }, /* text set later, see below */ + + { SGBUTTON, SG_DEFAULT, 0, 17,17, 20,1, "Back to main menu" }, + { SGSTOP, 0, 0, 0,0, 0,0, NULL } +}; + +/* for record buttons */ +#define VIDEO_START "Recor_d AVI" +#define VIDEO_STOP "Stop recor_d" +#define AUDIO_START "Rec_ord YM/WAV" +#define AUDIO_STOP "Stop rec_ording" + +#define DEFAULT_AUDIO_FILE "./hatari.wav" + + +/** + * Set ScreenShotFormat depending on which button is selected + */ +static void DlgRecord_SetScreenShotFormat(void) +{ + if ( recorddlg[DLGRECORD_FORMAT_NEO].state & SG_SELECTED ) + ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_NEO; + else if ( recorddlg[DLGRECORD_FORMAT_XIMG].state & SG_SELECTED ) + ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_XIMG; +#if HAVE_LIBPNG + else if ( recorddlg[DLGRECORD_FORMAT_PNG].state & SG_SELECTED ) + ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_PNG; +#endif + else + ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_BMP; +} + +/*-----------------------------------------------------------------------*/ +/** + * If screenshot dir path given, set it to screenshot dir config string, + * and update dialog screenshot dir field accordingly. + */ +static void DlgRecord_UpdateScreenShotDir(void) +{ + if (ConfigureParams.Screen.szScreenShotDir[0]) + { + File_MakeValidPathName(ConfigureParams.Screen.szScreenShotDir); + File_CleanFileName(ConfigureParams.Screen.szScreenShotDir); + File_ShrinkName(dlgShotDir, ConfigureParams.Screen.szScreenShotDir, sizeof(dlgShotDir)-1); + } + else + { + static const char base[] = "(default) "; + const int len = sizeof(base) - 1; + assert(len < sizeof(dlgShotDir)); + Str_Copy(dlgShotDir, base, sizeof(dlgShotDir)); + File_ShrinkName(dlgShotDir + len, Configuration_GetScreenShotDir(), sizeof(dlgShotDir)-len-1); + } +} + +/** + * Show and process the recording dialog. + */ +void Dialog_RecordingDlg(void) +{ + char *selname; + int but; + + SDLGui_CenterDlg(recorddlg); + + /* Initialize window capture options: */ + DlgRecord_UpdateScreenShotDir(); + + recorddlg[DLGRECORD_FORMAT_PNG].state &= ~SG_SELECTED; + recorddlg[DLGRECORD_FORMAT_BMP].state &= ~SG_SELECTED; + recorddlg[DLGRECORD_FORMAT_NEO].state &= ~SG_SELECTED; + recorddlg[DLGRECORD_FORMAT_XIMG].state &= ~SG_SELECTED; + if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_NEO ) + recorddlg[DLGRECORD_FORMAT_NEO].state |= SG_SELECTED; + else if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_XIMG ) + recorddlg[DLGRECORD_FORMAT_XIMG].state |= SG_SELECTED; +#if HAVE_LIBPNG + else if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_PNG) + recorddlg[DLGRECORD_FORMAT_PNG].state |= SG_SELECTED; +#endif + else + recorddlg[DLGRECORD_FORMAT_BMP].state |= SG_SELECTED; + + if (ConfigureParams.Screen.bCrop) + recorddlg[DLGRECORD_CROP].state |= SG_SELECTED; + else + recorddlg[DLGRECORD_CROP].state &= ~SG_SELECTED; + + if (Avi_AreWeRecording()) + recorddlg[DLGRECORD_RECVIDEO].txt = VIDEO_STOP; + else + recorddlg[DLGRECORD_RECVIDEO].txt = VIDEO_START; + + /* Initialize audio capture options: */ + File_ShrinkName(dlgAudioName, ConfigureParams.Sound.szYMCaptureFileName, recorddlg[DLGRECORD_AUDIONAME].w); + + if (Sound_AreWeRecording()) + recorddlg[DLGRECORD_RECAUDIO].txt = AUDIO_STOP; + else + recorddlg[DLGRECORD_RECAUDIO].txt = AUDIO_START; + + /* Recording dialog main loop */ + do + { + but = SDLGui_DoDialog(recorddlg); + switch (but) + { + case DLGRECORD_CAPTURE_DIR: + selname = SDLGui_FileSelect("Screenshot Directory", Configuration_GetScreenShotDir(), NULL, false); + if (selname) + { + Str_Copy(ConfigureParams.Screen.szScreenShotDir, selname, sizeof(ConfigureParams.Screen.szScreenShotDir)); + free(selname); + } + DlgRecord_UpdateScreenShotDir(); + break; + + case DLGRECORD_CAPTURE: + DlgRecord_SetScreenShotFormat(); /* Take latest choice into account */ + Screen_UpdateRect(sdlscrn, 0,0,0,0); + ConfigureParams.Screen.bCrop = (recorddlg[DLGRECORD_CROP].state & SG_SELECTED); + ScreenSnapShot_SaveScreen(); + break; + + case DLGRECORD_RECVIDEO: + if (Avi_AreWeRecording()) + { + /* AVI indexing can take a while for larger files */ + Statusbar_AddMessage("Finishing AVI file...", 100); + Statusbar_Update(sdlscrn, true); + Avi_StopRecording(); + recorddlg[DLGRECORD_RECVIDEO].txt = VIDEO_START; + Statusbar_AddMessage("Emulation paused", 100); + Statusbar_Update(sdlscrn, true); + } + else + { + ConfigureParams.Screen.bCrop = (recorddlg[DLGRECORD_CROP].state & SG_SELECTED); + selname = SDLGui_FileSelect("Record to AVI file...", ConfigureParams.Video.AviRecordFile, NULL, true); + if (!selname || File_DoesFileNameEndWithSlash(selname)) + break; + if (!File_QueryOverwrite(selname)) + break; + Str_Copy(ConfigureParams.Video.AviRecordFile, selname, sizeof(ConfigureParams.Video.AviRecordFile)); + Avi_StartRecording_WithConfig (); + recorddlg[DLGRECORD_RECVIDEO].txt = VIDEO_STOP; + } + break; + case DLGRECORD_RECBROWSE: /* Choose a new record file */ + SDLGui_FileConfSelect("Capture file:", dlgAudioName, + ConfigureParams.Sound.szYMCaptureFileName, + sizeof(dlgAudioName)-1, + true); + break; + case DLGRECORD_RECAUDIO: + if (Sound_AreWeRecording()) + { + recorddlg[DLGRECORD_RECAUDIO].txt = AUDIO_START; + Sound_EndRecording(); + } + else + { + /* make sure that we have a valid file name... */ + if (strlen(ConfigureParams.Sound.szYMCaptureFileName) < 4) + { + strcpy(ConfigureParams.Sound.szYMCaptureFileName, DEFAULT_AUDIO_FILE); + } + recorddlg[DLGRECORD_RECAUDIO].txt = AUDIO_STOP; + Sound_BeginRecording(ConfigureParams.Sound.szYMCaptureFileName); + } + break; + } + } + while (but != DLGRECORD_EXIT_RECORD && but != SDLGUI_QUIT + && but != SDLGUI_ERROR && !bQuitProgram); + + /* Read new values from dialog: */ + DlgRecord_SetScreenShotFormat(); + + ConfigureParams.Screen.bCrop = (recorddlg[DLGRECORD_CROP].state & SG_SELECTED); +} diff --git a/src/gui-sdl/dlgScreen.c b/src/gui-sdl/dlgScreen.c index f3aaf540..0aa28379 100644 --- a/src/gui-sdl/dlgScreen.c +++ b/src/gui-sdl/dlgScreen.c @@ -15,22 +15,17 @@ const char DlgScreen_fileid[] = "Hatari dlgScreen.c"; #include "sdlgui.h" #include "options.h" #include "screen.h" -#include "screenSnapShot.h" #include "resolution.h" #include "vdi.h" #include "video.h" -#include "avi_record.h" -#include "statusbar.h" -#include "clocks_timings.h" -#include "file.h" -#include "str.h" /* how many pixels to increment VDI mode * width/height on each click */ #define VDI_SIZE_INC 16 -/* The Monitor dialog: */ +/* ------------ The Monitor dialog: -------------- */ + #define DLGSCRN_MONO 3 #define DLGSCRN_RGB 4 #define DLGSCRN_VGA 5 @@ -85,8 +80,8 @@ static SGOBJ monitordlg[] = { SGSTOP, 0, 0, 0,0, 0,0, NULL } }; +/* ---------------- The window dialog: -------------- */ -/* The window dialog: */ #define DLGSCRN_FULLSCRN 3 #define DLGSCRN_STATUSBAR 5 #define DLGSCRN_DRIVELED 6 @@ -104,18 +99,10 @@ static SGOBJ monitordlg[] = #define DLGSCRN_MAX_HLESS 23 #define DLGSCRN_MAX_HTEXT 24 #define DLGSCRN_MAX_HMORE 25 -#define DLGSCRN_CAPTURE 27 -#define DLGSCRN_FORMAT_PNG 28 -#define DLGSCRN_FORMAT_BMP 29 -#define DLGSCRN_FORMAT_NEO 30 -#define DLGSCRN_FORMAT_XIMG 31 -#define DLGSCRN_CAPTURE_DIR 32 -#define DLGSCRN_RECANIM 34 -#define DLGSCRN_CROP 35 -#define DLGSCRN_GPUSCALE 37 -#define DLGSCRN_RESIZABLE 38 -#define DLGSCRN_VSYNC 39 -#define DLGSCRN_EXIT_WINDOW 40 +#define DLGSCRN_GPUSCALE 28 +#define DLGSCRN_RESIZABLE 29 +#define DLGSCRN_VSYNC 30 +#define DLGSCRN_EXIT_WINDOW 31 /* needs to match Frame skip values in windowdlg[]! */ static const int skip_frames[] = { 0, 1, 2, 4, AUTO_FRAMESKIP_LIMIT }; @@ -123,15 +110,13 @@ static const int skip_frames[] = { 0, 1, 2, 4, AUTO_FRAMESKIP_LIMIT }; /* Strings for doubled resolution max width and height */ static char sMaxWidth[5]; static char sMaxHeight[5]; -/* Screenshot path name shown in the dialog */ -static char sScreenShotDir[29]; #define MAX_SIZE_STEP 8 /* The window dialog: */ static SGOBJ windowdlg[] = { - { SGBOX, 0, 0, 0,0, 52,24, NULL }, + { SGBOX, 0, 0, 0,0, 52,18, NULL }, { SGBOX, 0, 0, 1,1, 50,10, NULL }, { SGTEXT, 0, 0, 4,2, 20,1, "Hatari screen options" }, { SGCHECKBOX, 0, 0, 4,4, 12,1, "_Fullscreen" }, @@ -158,32 +143,17 @@ static SGOBJ windowdlg[] = { SGTEXT, 0, 0, 37,9, 4,1, sMaxHeight }, { SGBUTTON, 0, 0, 43,9, 1,1, "\x03", SG_SHORTCUT_DOWN }, - { SGBOX, 0, 0, 1,12, 50,7, NULL }, - { SGBUTTON, 0, 0, 4,13, 14,1, "_Screenshot" }, - { SGRADIOBUT, 0, 0, 21,13, 5,1, "PNG" }, - { SGRADIOBUT, 0, 0, 27,13, 5,1, "BMP" }, - { SGRADIOBUT, 0, 0, 33,13, 5,1, "NEO" }, - { SGRADIOBUT, 0, 0, 39,13, 5,1, "XIMG" }, - { SGBUTTON, 0, 0, 4,15, 14,1, "Directory:" }, - { SGTEXT, 0, 0, 21,15, sizeof(sScreenShotDir)-1,1, sScreenShotDir }, - { SGBUTTON, 0, 0, 4,17, 14,1, NULL }, /* Record text set later */ - { SGCHECKBOX, 0, 0, 21,17, 16,1, "_Crop statusbar" }, - - { SGTEXT, 0, 0, 4,20, 12,1, "SDL2:" }, - { SGCHECKBOX, 0, 0, 12,20, 20,1, "GPU scal_ing" }, - { SGCHECKBOX, 0, 0, 27,20, 20,1, "Resi_zable" }, - { SGCHECKBOX, 0, 0, 40,20, 11,1, "_VSync" }, - - { SGBUTTON, SG_DEFAULT, 0, 17,22, 20,1, "Back to main menu" }, + { SGBOX, 0, 0, 1,12, 50,3, NULL }, + { SGTEXT, 0, 0, 4,13, 12,1, "SDL2:" }, + { SGCHECKBOX, 0, 0, 12,13, 20,1, "GPU scal_ing" }, + { SGCHECKBOX, 0, 0, 27,13, 20,1, "Resi_zable" }, + { SGCHECKBOX, 0, 0, 40,13, 11,1, "_VSync" }, + + { SGBUTTON, SG_DEFAULT, 0, 17,16, 20,1, "Back to main menu" }, { SGSTOP, 0, 0, 0,0, 0,0, NULL } }; -/* for record button */ -#define RECORD_START "_Record AVI" -#define RECORD_STOP "Stop _record" - - -/* ---------------------------------------------------------------- */ +/* --------------- Monitor dialog ---------------------- */ /** * To be called when changing VDI mode bit-depth. * Sets width & height stepping for VDI resolution changing, @@ -312,50 +282,8 @@ void Dialog_MonitorDlg(void) } } +/*-------------------- Hatari window dialog ----------------------*/ - -/*-----------------------------------------------------------------------*/ -/** - * Set ScreenShotFormat depending on which button is selected - */ -static void DlgWindow_SetScreenShotFormat(void) -{ - if ( windowdlg[DLGSCRN_FORMAT_NEO].state & SG_SELECTED ) - ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_NEO; - else if ( windowdlg[DLGSCRN_FORMAT_XIMG].state & SG_SELECTED ) - ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_XIMG; -#if HAVE_LIBPNG - else if ( windowdlg[DLGSCRN_FORMAT_PNG].state & SG_SELECTED ) - ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_PNG; -#endif - else - ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_BMP; -} - -/*-----------------------------------------------------------------------*/ -/** - * If screenshot dir path given, set it to screenshot dir config string, - * and update dialog screenshot dir field accordingly. - */ -static void DlgWindow_UpdateScreenShotDir(void) -{ - if (ConfigureParams.Screen.szScreenShotDir[0]) - { - File_MakeValidPathName(ConfigureParams.Screen.szScreenShotDir); - File_CleanFileName(ConfigureParams.Screen.szScreenShotDir); - File_ShrinkName(sScreenShotDir, ConfigureParams.Screen.szScreenShotDir, sizeof(sScreenShotDir)-1); - } - else - { - static const char base[] = "(default) "; - const int len = sizeof(base) - 1; - assert(len < sizeof(sScreenShotDir)); - Str_Copy(sScreenShotDir, base, sizeof(sScreenShotDir)); - File_ShrinkName(sScreenShotDir + len, Configuration_GetScreenShotDir(), sizeof(sScreenShotDir)-len-1); - } -} - -/*-----------------------------------------------------------------------*/ /** * Show and process the window dialog. */ @@ -363,7 +291,6 @@ void Dialog_WindowDlg(void) { int maxw, maxh, deskw, deskh, but, skip = 0; unsigned int i; - char *selname; SDLGui_CenterDlg(windowdlg); @@ -403,34 +330,6 @@ void Dialog_WindowDlg(void) sprintf(sMaxWidth, "%4i", maxw); sprintf(sMaxHeight, "%4i", maxh); - /* Initialize window capture options: */ - DlgWindow_UpdateScreenShotDir(); - - windowdlg[DLGSCRN_FORMAT_PNG].state &= ~SG_SELECTED; - windowdlg[DLGSCRN_FORMAT_BMP].state &= ~SG_SELECTED; - windowdlg[DLGSCRN_FORMAT_NEO].state &= ~SG_SELECTED; - windowdlg[DLGSCRN_FORMAT_XIMG].state &= ~SG_SELECTED; - if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_NEO ) - windowdlg[DLGSCRN_FORMAT_NEO].state |= SG_SELECTED; - else if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_XIMG ) - windowdlg[DLGSCRN_FORMAT_XIMG].state |= SG_SELECTED; -#if HAVE_LIBPNG - else if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_PNG) - windowdlg[DLGSCRN_FORMAT_PNG].state |= SG_SELECTED; -#endif - else - windowdlg[DLGSCRN_FORMAT_BMP].state |= SG_SELECTED; - - if (ConfigureParams.Screen.bCrop) - windowdlg[DLGSCRN_CROP].state |= SG_SELECTED; - else - windowdlg[DLGSCRN_CROP].state &= ~SG_SELECTED; - - if (Avi_AreWeRecording()) - windowdlg[DLGSCRN_RECANIM].txt = RECORD_STOP; - else - windowdlg[DLGSCRN_RECANIM].txt = RECORD_START; - /* SDL2 options */ if (ConfigureParams.Screen.bResizable) windowdlg[DLGSCRN_RESIZABLE].state |= SG_SELECTED; @@ -469,48 +368,6 @@ void Dialog_WindowDlg(void) maxh = Opt_ValueAlignMinMax(maxh + MAX_SIZE_STEP, MAX_SIZE_STEP, MIN_VDI_HEIGHT, deskh); sprintf(sMaxHeight, "%4i", maxh); break; - - case DLGSCRN_CAPTURE_DIR: - selname = SDLGui_FileSelect("Screenshot Directory", Configuration_GetScreenShotDir(), NULL, false); - if (selname) - { - Str_Copy(ConfigureParams.Screen.szScreenShotDir, selname, sizeof(ConfigureParams.Screen.szScreenShotDir)); - free(selname); - } - DlgWindow_UpdateScreenShotDir(); - break; - - case DLGSCRN_CAPTURE: - DlgWindow_SetScreenShotFormat(); /* Take latest choice into account */ - Screen_UpdateRect(sdlscrn, 0,0,0,0); - ConfigureParams.Screen.bCrop = (windowdlg[DLGSCRN_CROP].state & SG_SELECTED); - ScreenSnapShot_SaveScreen(); - break; - - case DLGSCRN_RECANIM: - if (Avi_AreWeRecording()) - { - /* AVI indexing can take a while for larger files */ - Statusbar_AddMessage("Finishing AVI file...", 100); - Statusbar_Update(sdlscrn, true); - Avi_StopRecording(); - windowdlg[DLGSCRN_RECANIM].txt = RECORD_START; - Statusbar_AddMessage("Emulation paused", 100); - Statusbar_Update(sdlscrn, true); - } - else - { - ConfigureParams.Screen.bCrop = (windowdlg[DLGSCRN_CROP].state & SG_SELECTED); - selname = SDLGui_FileSelect("Record to AVI file...", ConfigureParams.Video.AviRecordFile, NULL, true); - if (!selname || File_DoesFileNameEndWithSlash(selname)) - break; - if (!File_QueryOverwrite(selname)) - break; - Str_Copy(ConfigureParams.Video.AviRecordFile, selname, sizeof(ConfigureParams.Video.AviRecordFile)); - Avi_StartRecording_WithConfig (); - windowdlg[DLGSCRN_RECANIM].txt = RECORD_STOP; - } - break; } } while (but != DLGSCRN_EXIT_WINDOW && but != SDLGUI_QUIT @@ -540,10 +397,6 @@ void Dialog_WindowDlg(void) } } - DlgWindow_SetScreenShotFormat(); - - ConfigureParams.Screen.bCrop = (windowdlg[DLGSCRN_CROP].state & SG_SELECTED); - ConfigureParams.Screen.bResizable = (windowdlg[DLGSCRN_RESIZABLE].state & SG_SELECTED); ConfigureParams.Screen.bUseSdlRenderer = (windowdlg[DLGSCRN_GPUSCALE].state & SG_SELECTED); ConfigureParams.Screen.bUseVsync = (windowdlg[DLGSCRN_VSYNC].state & SG_SELECTED); diff --git a/src/gui-sdl/dlgSound.c b/src/gui-sdl/dlgSound.c index cf844565..08a64c55 100644 --- a/src/gui-sdl/dlgSound.c +++ b/src/gui-sdl/dlgSound.c @@ -13,7 +13,6 @@ const char DlgSound_fileid[] = "Hatari dlgSound.c"; #include "file.h" #include "sound.h" - #define DLGSOUND_ENABLE 3 #define DLGSOUND_SYNC 4 #define DLGSOUND_11KHZ 6 @@ -28,19 +27,12 @@ const char DlgSound_fileid[] = "Hatari dlgSound.c"; #define DLGSOUND_MODEL 16 #define DLGSOUND_TABLE 17 #define DLGSOUND_LINEAR 18 -#define DLGSOUND_RECNAME 22 -#define DLGSOUND_RECBROWSE 23 -#define DLGSOUND_RECORD 24 -#define DLGSOUND_EXIT 25 - - -static char dlgRecordName[35]; - +#define DLGSOUND_EXIT 19 /* The sound dialog: */ static SGOBJ sounddlg[] = { - { SGBOX, 0,0, 0, 0, 40,25, NULL }, + { SGBOX, 0,0, 0, 0, 40,17, NULL }, { SGBOX, 0,0, 1, 1, 38,13, NULL }, { SGTEXT, 0,0, 4, 2, 5,1, "SOUND" }, { SGCHECKBOX, 0,0, 13, 2, 9,1, "_Enabled" }, @@ -62,20 +54,10 @@ static SGOBJ sounddlg[] = { SGRADIOBUT, 0,0, 15,12, 10,1, "_ST table" }, { SGRADIOBUT, 0,0, 28,12, 8,1, "_Linear" }, - { SGBOX, 0,0, 1,15, 38,7, NULL }, - { SGTEXT, 0,0, 13,16, 14,1, "Capture YM/WAV" }, - { SGTEXT, 0,0, 2,17, 26,1, "File name (*.wav / *.ym):" }, - { SGTEXT, 0,0, 2,18, 34,1, dlgRecordName }, - { SGBUTTON, 0,0, 28,17, 8,1, " _Browse " }, - { SGBUTTON, 0,0, 12,20, 16,1, NULL }, /* text set later, see below */ - - { SGBUTTON, SG_DEFAULT, 0, 10,23, 20,1, "Back to main menu" }, + { SGBUTTON, SG_DEFAULT, 0, 10,15, 20,1, "Back to main menu" }, { SGSTOP, 0, 0, 0,0, 0,0, NULL } }; -#define RECORD_START "_Record sound" -#define RECORD_STOP "Stop _recording" - static const int nSoundFreqs[] = { 11025, @@ -136,43 +118,10 @@ void Dialog_SoundDlg(void) else sounddlg[DLGSOUND_LINEAR].state |= SG_SELECTED; - File_ShrinkName(dlgRecordName, ConfigureParams.Sound.szYMCaptureFileName, sounddlg[DLGSOUND_RECNAME].w); - - if ( Sound_AreWeRecording() ) - sounddlg[DLGSOUND_RECORD].txt = RECORD_STOP; - else - sounddlg[DLGSOUND_RECORD].txt = RECORD_START; - /* The sound dialog main loop */ do { but = SDLGui_DoDialog(sounddlg); - switch (but) - { - case DLGSOUND_RECBROWSE: /* Choose a new record file */ - SDLGui_FileConfSelect("Capture file:", dlgRecordName, - ConfigureParams.Sound.szYMCaptureFileName, - sounddlg[DLGSOUND_RECNAME].w, - true); - break; - case DLGSOUND_RECORD: - if (Sound_AreWeRecording()) - { - sounddlg[DLGSOUND_RECORD].txt = RECORD_START; - Sound_EndRecording(); - } - else - { - /* make sure that we have a valid file name... */ - if (strlen(ConfigureParams.Sound.szYMCaptureFileName) < 4) - { - strcpy(ConfigureParams.Sound.szYMCaptureFileName, "./hatari.wav"); - } - sounddlg[DLGSOUND_RECORD].txt = RECORD_STOP; - Sound_BeginRecording(ConfigureParams.Sound.szYMCaptureFileName); - } - break; - } } while (but != DLGSOUND_EXIT && but != SDLGUI_QUIT && but != SDLGUI_ERROR && !bQuitProgram ); diff --git a/src/includes/dialog.h b/src/includes/dialog.h index 918e642b..9caa9bf8 100644 --- a/src/includes/dialog.h +++ b/src/includes/dialog.h @@ -26,6 +26,7 @@ extern bool Dialog_MemDlg(void); extern char* DlgNewDisk_Main(void); extern void Dialog_MonitorDlg(void); extern void Dialog_WindowDlg(void); +extern void Dialog_RecordingDlg(void); extern void Dialog_SoundDlg(void); extern void DlgSystem_Main(void); extern void DlgRom_Main(void); -- 2.39.5
Attachment:
main-dialog.png
Description: PNG image
Attachment:
record-dialog.png
Description: PNG image
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |