static void saveDocument (TextEditor me, MelderFile file) { autostring32 text = GuiText_getString (my textWidget); MelderFile_writeText (file, text.peek(), Melder_getOutputEncoding ()); my dirty = false; MelderFile_copy (file, & my file); if (my v_fileBased ()) Thing_setName (me, Melder_fileToPath (file)); }
static void LongSound_init (LongSound me, MelderFile file) { MelderFile_copy (file, & my file); MelderFile_open (file); // BUG: should be auto, but that requires an implemented .transfer() my f = file -> filePointer; my audioFileType = MelderFile_checkSoundFile (file, & my numberOfChannels, & my encoding, & my sampleRate, & my startOfData, & my nx); if (my audioFileType == 0) Melder_throw (U"File not recognized (LongSound only supports AIFF, AIFC, WAV, NeXT/Sun, NIST and FLAC)."); if (my encoding == Melder_SHORTEN || my encoding == Melder_POLYPHONE) Melder_throw (U"LongSound does not support sound files compressed with \"shorten\"."); if (my nx < 1) Melder_throw (U"Audio file contains 0 samples."); my xmin = 0.0; my dx = 1 / my sampleRate; my xmax = my nx * my dx; my x1 = 0.5 * my dx; my numberOfBytesPerSamplePoint = Melder_bytesPerSamplePoint (my encoding); my bufferLength = prefs_bufferLength; for (;;) { my nmax = my bufferLength * my numberOfChannels * my sampleRate * (1 + 3 * MARGIN); try { my buffer = NUMvector <int16> (0, my nmax * my numberOfChannels); break; } catch (MelderError) { my bufferLength *= 0.5; // try 30, 15, or 7.5 seconds if (my bufferLength < 5.0) // too short to be good throw; Melder_clearError (); // delete out-of-memory message } } my imin = 1; my imax = 0; my flacDecoder = nullptr; if (my audioFileType == Melder_FLAC) { my flacDecoder = FLAC__stream_decoder_new (); FLAC__stream_decoder_init_FILE (my flacDecoder, my f, _LongSound_FLAC_write, nullptr, _LongSound_FLAC_error, me); } my mp3f = nullptr; if (my audioFileType == Melder_MP3) { my mp3f = mp3f_new (); mp3f_set_file (my mp3f, my f); mp3f_set_callback (my mp3f, _LongSound_MP3_convert, me); if (! mp3f_analyze (my mp3f)) Melder_throw (U"Unable to analyze MP3 file."); Melder_warning (U"Time measurements in MP3 files can be off by several tens of milliseconds. " U"Please convert to WAV file if you need time precision or annotation."); } }
void UiOutfile::do_ (const wchar_t *defaultName) { wchar_t *outfileName = GuiFileSelect_getOutfileName (NULL, _name, defaultName); if (outfileName == NULL) return; // cancelled if (_allowExecutionHook && ! _allowExecutionHook (_allowExecutionClosure)) { Melder_flushError ("Dialog `%s' cancelled.", _name); return; } Melder_pathToFile (outfileName, & _file); structMelderFile file; MelderFile_copy (& _file, & file); // save, because okCallback could destroy me UiForm::history.write (L"\n"); UiForm::history.write (_invokingButtonTitle); if (! _okCallback (this, NULL, NULL, _invokingButtonTitle, false, _okClosure)) { Melder_error3 (L"File ", MelderFile_messageName (& file), L" not finished."); Melder_flushError (NULL); } UiForm::history.write (L" "); UiForm::history.write (outfileName); Melder_free (outfileName); }
autoScriptEditor ScriptEditor_createFromScript_canBeNull (Editor environment, Script script) { try { for (long ieditor = 1; ieditor <= theReferencesToAllOpenScriptEditors.size; ieditor ++) { ScriptEditor editor = theReferencesToAllOpenScriptEditors.at [ieditor]; if (MelderFile_equal (& script -> file, & editor -> file)) { Editor_raise (editor); Melder_appendError (U"The script ", & script -> file, U" is already open and has been moved to the front."); if (editor -> dirty) Melder_appendError (U"Choose \"Reopen from disk\" if you want to revert to the old version."); Melder_flushError (); return autoScriptEditor(); // safe null } } autostring32 text = MelderFile_readText (& script -> file); autoScriptEditor me = ScriptEditor_createFromText (environment, text.peek()); MelderFile_copy (& script -> file, & my file); Thing_setName (me.peek(), Melder_fileToPath (& script -> file)); return me; } catch (MelderError) { Melder_throw (U"Script window not created."); } }
void UiInfile::do_ () { SortedSetOfString infileNames = GuiFileSelect_getInfileNames (_parent, _name, _allowMultipleFiles); if (infileNames == NULL) { Melder_flushError (NULL); return; } for (long ifile = 1; ifile <= infileNames -> size; ifile ++) { SimpleString infileName = (structSimpleString*)infileNames -> item [ifile]; Melder_pathToFile (infileName -> string, & _file); UiForm::history.write (L"\n"); UiForm::history.write (_invokingButtonTitle); UiForm::history.write (L" "); UiForm::history.write (infileName -> string); structMelderFile file; MelderFile_copy (& _file, & file); if (! _okCallback (this, NULL, NULL, _invokingButtonTitle, false, _okClosure)) { Melder_error3 (L"File ", MelderFile_messageName (& file), L" not finished."); Melder_flushError (NULL); } } forget (infileNames); }
static void openDocument (TextEditor me, MelderFile file) { if (theOpenTextEditors) { for (long ieditor = 1; ieditor <= theOpenTextEditors -> size; ieditor ++) { TextEditor editor = (TextEditor) theOpenTextEditors -> item [ieditor]; if (editor != me && MelderFile_equal (file, & editor -> file)) { Editor_raise (editor); Melder_appendError (U"Text file ", file, U" is already open."); forget (me); // don't forget me before Melder_appendError, because "file" is owned by one of my dialogs Melder_flushError (); return; } } } autostring32 text = MelderFile_readText (file); GuiText_setString (my textWidget, text.peek()); /* * GuiText_setString has invoked the changeCallback, * which has set `my dirty` to `true`. Fix this. */ my dirty = false; MelderFile_copy (file, & my file); Thing_setName (me, Melder_fileToPath (file)); }
ScriptEditor ScriptEditor_createFromScript (Editor environment, Script script) { try { if (theScriptEditors) { for (long ieditor = 1; ieditor <= theScriptEditors -> size; ieditor ++) { ScriptEditor editor = (ScriptEditor) theScriptEditors -> item [ieditor]; if (MelderFile_equal (& script -> file, & editor -> file)) { editor -> raise (); Melder_error_ ("The script ", & script -> file, " is already open and has been moved to the front."); if (editor -> dirty) Melder_error_ ("Choose \"Reopen from disk\" if you want to revert to the old version."); Melder_flushError (NULL); return NULL; // safe NULL } } } autostring text = MelderFile_readText (& script -> file); autoScriptEditor me = ScriptEditor_createFromText (environment, text.peek()); MelderFile_copy (& script -> file, & my file); Thing_setName (me.peek(), Melder_fileToPath (& script -> file)); return me.transfer(); } catch (MelderError) { Melder_throw ("Script window not created."); } }