Added WAV file recording capability to Qt GUI.

This commit is contained in:
mjbudd77 2021-05-05 20:25:34 -04:00
parent d7ca6ccc18
commit 0b689d65c4
6 changed files with 193 additions and 2 deletions

View File

@ -47,6 +47,7 @@
#include "../../file.h"
#include "../../input.h"
#include "../../movie.h"
#include "../../wave.h"
#include "../../version.h"
#include "common/os_utils.h"
@ -1533,6 +1534,45 @@ void consoleWin_t::createMainMenu(void)
connect(act, SIGNAL(triggered(bool)), this, SLOT(aviAudioEnableChange(bool)) );
aviMenu->addAction(act);
// Movie -> WAV Recording
subMenu = movieMenu->addMenu( tr("&WAV Recording") );
// Movie -> Avi Recording -> Record
recWavAct = new QAction(tr("&Record"), this);
//recWavAct->setShortcut( QKeySequence(tr("Shift+F5")));
recWavAct->setStatusTip(tr("WAV Record Start"));
recWavAct->setIcon( QIcon(":icons/media-record.png") );
connect(recWavAct, SIGNAL(triggered()), this, SLOT(wavRecordStart(void)) );
Hotkeys[ HK_RECORD_WAV ].setAction( recWavAct );
connect( Hotkeys[ HK_RECORD_WAV ].getShortcut(), SIGNAL(activated()), this, SLOT(wavRecordStart(void)) );
subMenu->addAction(recWavAct);
// Movie -> WAV Recording -> Record
recAsWavAct = new QAction(tr("Record &As"), this);
//recAsWavAct->setShortcut( QKeySequence(tr("Shift+F5")));
recAsWavAct->setStatusTip(tr("WAV Record As Start"));
//recAsWavAct->setIcon( QIcon(":icons/media-record.png") );
connect(recAsWavAct, SIGNAL(triggered()), this, SLOT(wavRecordAsStart(void)) );
Hotkeys[ HK_RECORD_WAV_TO ].setAction( recAsWavAct );
connect( Hotkeys[ HK_RECORD_WAV_TO ].getShortcut(), SIGNAL(activated()), this, SLOT(wavRecordAsStart(void)) );
subMenu->addAction(recAsWavAct);
// Movie -> WAV Recording -> Stop
stopWavAct = new QAction(tr("&Stop"), this);
//stopWavAct->setShortcut( QKeySequence(tr("Shift+F5")));
stopWavAct->setStatusTip(tr("WAV Record Stop"));
stopWavAct->setIcon( style()->standardIcon( QStyle::SP_MediaStop ) );
connect(stopWavAct, SIGNAL(triggered()), this, SLOT(wavRecordStop(void)) );
Hotkeys[ HK_STOP_WAV ].setAction( stopWavAct );
connect( Hotkeys[ HK_STOP_WAV ].getShortcut(), SIGNAL(activated()), this, SLOT(wavRecordStop(void)) );
subMenu->addAction(stopWavAct);
//-----------------------------------------------------------------------
// Help
helpMenu = menubar->addMenu(tr("&Help"));
@ -3283,6 +3323,131 @@ void consoleWin_t::aviVideoFormatChanged(int idx)
aviSetSelVideoFormat(idx);
}
void consoleWin_t::wavRecordStart(void)
{
if ( !FCEUI_WaveRecordRunning() )
{
const char *romFile;
char fileName[1024];
romFile = getRomFile();
if ( romFile )
{
char base[512];
const char *baseDir = FCEUI_GetBaseDirectory();
getFileBaseName( romFile, base );
if ( baseDir )
{
strcpy( fileName, baseDir );
strcat( fileName, "/wav/" );
}
else
{
fileName[0] = 0;
}
strcat( fileName, base );
strcat( fileName, ".wav");
//printf("WAV Filepath:'%s'\n", fileName );
}
else
{
return;
}
fceuWrapperLock();
FCEUI_BeginWaveRecord( fileName );
fceuWrapperUnLock();
}
}
void consoleWin_t::wavRecordAsStart(void)
{
if ( FCEUI_WaveRecordRunning() )
{
return;
}
int ret, useNativeFileDialogVal;
QString filename;
std::string last;
//char dir[512];
const char *base;
QFileDialog dialog(this, tr("Save WAV Movie for Recording") );
QList<QUrl> urls;
QDir d;
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setNameFilter(tr("WAV Movies (*.wav) ;; All files (*)"));
dialog.setViewMode(QFileDialog::List);
dialog.setFilter( QDir::AllEntries | QDir::AllDirs | QDir::Hidden );
dialog.setLabelText( QFileDialog::Accept, tr("Save") );
base = FCEUI_GetBaseDirectory();
urls << QUrl::fromLocalFile( QDir::rootPath() );
urls << QUrl::fromLocalFile(QStandardPaths::standardLocations(QStandardPaths::HomeLocation).first());
urls << QUrl::fromLocalFile(QStandardPaths::standardLocations(QStandardPaths::DownloadLocation).first());
if ( base )
{
urls << QUrl::fromLocalFile( QDir( base ).absolutePath() );
d.setPath( QString(base) + "/wav");
if ( d.exists() )
{
urls << QUrl::fromLocalFile( d.absolutePath() );
}
dialog.setDirectory( d.absolutePath() );
}
dialog.setDefaultSuffix( tr(".wav") );
// Check config option to use native file dialog or not
g_config->getOption ("SDL.UseNativeFileDialog", &useNativeFileDialogVal);
dialog.setOption(QFileDialog::DontUseNativeDialog, !useNativeFileDialogVal);
dialog.setSidebarUrls(urls);
ret = dialog.exec();
if ( ret )
{
QStringList fileList;
fileList = dialog.selectedFiles();
if ( fileList.size() > 0 )
{
filename = fileList[0];
}
}
if ( filename.isNull() )
{
return;
}
qDebug() << "selected file path : " << filename.toUtf8();
FCEUI_printf ("WAV Recording movie to %s\n", filename.toStdString().c_str() );
fceuWrapperLock();
FCEUI_BeginWaveRecord( filename.toStdString().c_str() );
fceuWrapperUnLock();
}
void consoleWin_t::wavRecordStop(void)
{
if ( FCEUI_WaveRecordRunning() )
{
fceuWrapperLock();
FCEUI_EndWaveRecord();
fceuWrapperUnLock();
}
}
void consoleWin_t::aboutFCEUX(void)
{
AboutWindow *aboutWin;
@ -3548,6 +3713,9 @@ void consoleWin_t::updatePeriodic(void)
recAviAct->setEnabled( FCEU_IsValidUI( FCEUI_RECORDMOVIE ) );
recAsAviAct->setEnabled( FCEU_IsValidUI( FCEUI_RECORDMOVIE ) );
stopAviAct->setEnabled( FCEU_IsValidUI( FCEUI_STOPAVI ) );
recWavAct->setEnabled( FCEU_IsValidUI( FCEUI_RECORDMOVIE ) && !FCEUI_WaveRecordRunning() );
recAsWavAct->setEnabled( FCEU_IsValidUI( FCEUI_RECORDMOVIE ) && !FCEUI_WaveRecordRunning() );
stopWavAct->setEnabled( FCEUI_WaveRecordRunning() );
}
if ( errorMsgValid )

View File

@ -207,6 +207,9 @@ class consoleWin_t : public QMainWindow
QAction *recAviAct;
QAction *recAsAviAct;
QAction *stopAviAct;
QAction *recWavAct;
QAction *recAsWavAct;
QAction *stopWavAct;
QTimer *gameTimer;
@ -367,6 +370,9 @@ class consoleWin_t : public QMainWindow
void aviRecordStop(void);
void aviAudioEnableChange(bool);
void aviVideoFormatChanged(int idx);
void wavRecordStart(void);
void wavRecordAsStart(void);
void wavRecordStop(void);
};

View File

@ -222,6 +222,15 @@ int getHotKeyConfig( int i, const char **nameOut, const char **keySeqOut, const
case HK_STOP_AVI:
name = "StopAvi"; keySeq = "";
break;
case HK_RECORD_WAV:
name = "RecordWav"; keySeq = "";
break;
case HK_RECORD_WAV_TO:
name = "RecordWavTo"; keySeq = "";
break;
case HK_STOP_WAV:
name = "StopWav"; keySeq = "";
break;
case HK_MUTE_CAPTURE:
name = "MuteCapture"; keySeq = "'";
break;
@ -344,7 +353,7 @@ LoadCPalette(const std::string &file)
static void
CreateDirs(const std::string &dir)
{
const char *subs[]={"fcs","snaps","gameinfo","sav","cheats","avi", "movies","input", NULL };
const char *subs[]={"fcs","snaps","gameinfo","sav","cheats","avi","wav","movies","input", NULL };
std::string subdir;
int x=0;

View File

@ -48,6 +48,7 @@ enum HOTKEY {
HK_BIND_STATE, HK_MOVIE_TOGGLE_RW,
HK_PLAY_MOVIE_FROM, HK_MOVIE_PLAY_RESTART, HK_RECORD_MOVIE_TO, HK_STOP_MOVIE,
HK_RECORD_AVI, HK_RECORD_AVI_TO, HK_STOP_AVI,
HK_RECORD_WAV, HK_RECORD_WAV_TO, HK_STOP_WAV,
// Display
HK_TOGGLE_FG, HK_TOGGLE_BG, HK_TOGGLE_INPUT_DISPLAY, HK_LAG_COUNTER_DISPLAY,

View File

@ -124,3 +124,8 @@ bool FCEUI_BeginWaveRecord(const char *fn)
return true;
}
bool FCEUI_WaveRecordRunning(void)
{
return (soundlog != NULL);
}

View File

@ -1,4 +1,6 @@
#include "types.h"
bool FCEUI_BeginWaveRecord(const char *fn);
bool FCEUI_WaveRecordRunning(void);
void FCEU_WriteWaveData(int32 *Buffer, int Count);
int FCEUI_EndWaveRecord();
int FCEUI_EndWaveRecord(void);