static void writePartToOpenFile (LongSound me, int audioFileType, long imin, long n, MelderFile file, int numberOfChannels_override, int numberOfBitsPerSamplePoint) { long ibuffer, offset, numberOfBuffers, numberOfSamplesInLastBuffer; offset = imin; numberOfBuffers = (n - 1) / my nmax + 1; numberOfSamplesInLastBuffer = (n - 1) % my nmax + 1; if (file -> filePointer) for (ibuffer = 1; ibuffer <= numberOfBuffers; ibuffer ++) { long numberOfSamplesToCopy = ibuffer < numberOfBuffers ? my nmax : numberOfSamplesInLastBuffer; LongSound_readAudioToShort (me, my buffer, offset, numberOfSamplesToCopy); offset += numberOfSamplesToCopy; MelderFile_writeShortToAudio (file, numberOfChannels_override ? numberOfChannels_override : my numberOfChannels, Melder_defaultAudioFileEncoding (audioFileType, numberOfBitsPerSamplePoint), my buffer, numberOfSamplesToCopy); } /* * We "have" no samples any longer. */ my imin = 1; my imax = 0; }
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."); } }