void LongSound_saveChannelAsAudioFile (LongSound me, int audioFileType, int channel, MelderFile file) { try { if (my numberOfChannels != 2) Melder_throw (U"This audio file is not a stereo file. It does not have a ", channel == 0 ? U"left" : U"right", U" channel."); autoMelderFile mfile = MelderFile_create (file); if (file -> filePointer) { MelderFile_writeAudioFileHeader (file, audioFileType, my sampleRate, my nx, 1, 8 * my numberOfBytesPerSamplePoint); } writePartToOpenFile (me, audioFileType, 1, my nx, file, channel == 0 ? -1 : -2, 8 * my numberOfBytesPerSamplePoint); MelderFile_writeAudioFileTrailer (file, audioFileType, my sampleRate, my nx, 1, 8 * my numberOfBytesPerSamplePoint); mfile.close (); } catch (MelderError) { Melder_throw (U"Channel ", channel, U" of ", me, U": not written to sound file ", file, U"."); } }
MelderFile Data_createTextFile (Daata me, MelderFile file, bool verbose) { autoMelderFile mfile = MelderFile_create (file); #if defined (_WIN32) file -> requiresCRLF = true; #endif file -> verbose = verbose; file -> outputEncoding = Melder_getOutputEncoding (); if (file -> outputEncoding == kMelder_textOutputEncoding_ASCII_THEN_UTF16) file -> outputEncoding = Data_canWriteAsEncoding (me, kMelder_textOutputEncoding_ASCII) ? kMelder_textOutputEncoding_ASCII : kMelder_textOutputEncoding_UTF16; else if (file -> outputEncoding == kMelder_textOutputEncoding_ISO_LATIN1_THEN_UTF16) file -> outputEncoding = Data_canWriteAsEncoding (me, kMelder_textOutputEncoding_ISO_LATIN1) ? kMelder_textOutputEncoding_ISO_LATIN1 : kMelder_textOutputEncoding_UTF16; if (file -> outputEncoding == kMelder_textOutputEncoding_UTF16) { binputu2 (0xfeff, file -> filePointer); } return mfile.transfer(); }
void LongSound_savePartAsAudioFile (LongSound me, int audioFileType, double tmin, double tmax, MelderFile file, int numberOfBitsPerSamplePoint) { try { if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; } if (tmin < my xmin) tmin = my xmin; if (tmax > my xmax) tmax = my xmax; long imin, imax; long n = Sampled_getWindowSamples (me, tmin, tmax, & imin, & imax); if (n < 1) Melder_throw (U"Less than 1 sample selected."); autoMelderFile mfile = MelderFile_create (file); MelderFile_writeAudioFileHeader (file, audioFileType, my sampleRate, n, my numberOfChannels, numberOfBitsPerSamplePoint); writePartToOpenFile (me, audioFileType, imin, n, file, 0, numberOfBitsPerSamplePoint); MelderFile_writeAudioFileTrailer (file, audioFileType, my sampleRate, n, my numberOfChannels, numberOfBitsPerSamplePoint); mfile.close (); } catch (MelderError) { Melder_throw (me, U": not written to sound file ", file, U"."); } }
void Data_writeToBinaryFile (Daata me, MelderFile file) { try { if (! Data_canWriteBinary (me)) Melder_throw (U"Objects of class ", my classInfo -> className, U" cannot be written to a generic binary file."); autoMelderFile mfile = MelderFile_create (file); if (fprintf (file -> filePointer, "ooBinaryFile") < 0) Melder_throw (U"Cannot write first bytes of file."); binputw1 ( my classInfo -> version > 0 ? Melder_cat (my classInfo -> className, U" ", my classInfo -> version) : my classInfo -> className, file -> filePointer); Data_writeBinary (me, file -> filePointer); mfile.close (); } catch (MelderError) { Melder_throw (me, U": not written to binary file ", file, U"."); } }
void LongSounds_writeToStereoAudioFile16 (LongSound me, LongSound thee, int audioFileType, MelderFile file) { try { long nbuf = my nmax < thy nmax ? my nmax : thy nmax; long nx = my nx > thy nx ? my nx : thy nx; long numberOfReads = (nx - 1) / nbuf + 1, numberOfBitsPerSamplePoint = 16; if (thy numberOfChannels != my numberOfChannels || my numberOfChannels != 1) { Melder_throw ("LongSounds must be mono."); } if (my sampleRate != thy sampleRate) { Melder_throw ("Sample rates must be equal."); } /* Allocate a stereo buffer of size (2 * the smallest)! WE SUPPOSE THAT SMALL IS LARGE ENOUGH. Read the same number of samples from both files, despite potential differences in internal buffer size. */ long nchannels = 2; autoNUMvector<short> buffer (1, nchannels * nbuf); autoMelderFile f = MelderFile_create (file); MelderFile_writeAudioFileHeader (file, audioFileType, my sampleRate, nx, nchannels, numberOfBitsPerSamplePoint); for (long i = 1; i <= numberOfReads; i++) { long n_to_write = i == numberOfReads ? (nx - 1) % nbuf + 1 : nbuf; _LongSound_to_multichannel_buffer (me, buffer.peek(), nbuf, nchannels, 1, i); _LongSound_to_multichannel_buffer (thee, buffer.peek(), nbuf, nchannels, 2, i); MelderFile_writeShortToAudio (file, nchannels, Melder_defaultAudioFileEncoding (audioFileType, numberOfBitsPerSamplePoint), buffer.peek(), n_to_write); } MelderFile_writeAudioFileTrailer (file, audioFileType, my sampleRate, nx, nchannels, numberOfBitsPerSamplePoint); f.close (); } catch (MelderError) { Melder_throw (me, ": no stereo audio file created."); } }
void LongSound_concatenate (SoundAndLongSoundList me, MelderFile file, int audioFileType, int numberOfBitsPerSamplePoint) { try { long sampleRate, n; /* Integer sampling frequencies only, because of possible rounding errors. */ int numberOfChannels; if (my size < 1) Melder_throw (U"No Sound or LongSound objects to concatenate."); /* * The sampling frequencies and numbers of channels must be equal for all (long)sounds. */ Sampled data = my at [1]; if (data -> classInfo == classSound) { Sound sound = (Sound) data; sampleRate = lround (1.0 / sound -> dx); numberOfChannels = sound -> ny; n = sound -> nx; } else { LongSound longSound = (LongSound) data; sampleRate = longSound -> sampleRate; numberOfChannels = longSound -> numberOfChannels; n = longSound -> nx; } /* * Check whether all the sampling frequencies and channels match. */ for (long i = 2; i <= my size; i ++) { int sampleRatesMatch, numbersOfChannelsMatch; data = my at [i]; if (data -> classInfo == classSound) { Sound sound = (Sound) data; sampleRatesMatch = round (1.0 / sound -> dx) == sampleRate; numbersOfChannelsMatch = sound -> ny == numberOfChannels; n += sound -> nx; } else { LongSound longSound = (LongSound) data; sampleRatesMatch = longSound -> sampleRate == sampleRate; numbersOfChannelsMatch = longSound -> numberOfChannels == numberOfChannels; n += longSound -> nx; } if (! sampleRatesMatch) Melder_throw (U"Sampling frequencies are not equal."); if (! numbersOfChannelsMatch) Melder_throw (U"Cannot mix stereo and mono."); } /* * Create output file and write header. */ autoMelderFile mfile = MelderFile_create (file); if (file -> filePointer) { MelderFile_writeAudioFileHeader (file, audioFileType, sampleRate, n, numberOfChannels, numberOfBitsPerSamplePoint); } for (long i = 1; i <= my size; i ++) { data = my at [i]; if (data -> classInfo == classSound) { Sound sound = (Sound) data; if (file -> filePointer) { MelderFile_writeFloatToAudio (file, sound -> ny, Melder_defaultAudioFileEncoding (audioFileType, numberOfBitsPerSamplePoint), sound -> z, sound -> nx, true); } } else { LongSound longSound = (LongSound) data; writePartToOpenFile (longSound, audioFileType, 1, longSound -> nx, file, 0, numberOfBitsPerSamplePoint); } } MelderFile_writeAudioFileTrailer (file, audioFileType, sampleRate, n, numberOfChannels, numberOfBitsPerSamplePoint); mfile.close (); } catch (MelderError) { Melder_throw (U"Sounds not concatenated and not saved to ", file, U"."); } }