1 #ifndef _LongSound_h_
2 #define _LongSound_h_
3 /* LongSound.h
4 *
5 * Copyright (C) 1992-2005,2007,2008,2010-2012,2015-2019 Paul Boersma, 2007 Erez Volk (for FLAC, MP3)
6 *
7 * This code is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or (at
10 * your option) any later version.
11 *
12 * This code is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 * See the GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this work. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "Sound.h"
22 #include "Collection.h"
23
24 #define COMPRESSED_MODE_READ_FLOAT 0
25 #define COMPRESSED_MODE_READ_SHORT 1
26
27 struct FLAC__StreamDecoder;
28 struct FLAC__StreamEncoder;
29 struct _MP3_FILE;
30
Thing_define(LongSound,Sampled)31 Thing_define (LongSound, Sampled) {
32 structMelderFile file;
33 FILE *f;
34 int audioFileType, encoding, numberOfBytesPerSamplePoint;
35 integer numberOfChannels;
36 double sampleRate;
37 integer startOfData;
38 double bufferLength;
39
40 integer nmax;
41 autovector <int16> buffer; // this is always 16-bit, because we will always play sounds in 16-bit, even those from 24-bit files
42 integer imin, imax;
43 void invalidateBuffer () noexcept { our imin = 1; our imax = 0; }
44
45 struct FLAC__StreamDecoder *flacDecoder;
46 struct _MP3_FILE *mp3f;
47 int compressedMode;
48 integer compressedSamplesLeft;
49 double *compressedFloats [2];
50 int16 *compressedShorts;
51
52 void v_destroy () noexcept
53 override;
54 void v_info ()
55 override;
56 void v_copy (Daata data_to)
57 override;
58 bool v_writable ()
59 override { return false; }
60 int v_domainQuantity ()
61 override { return MelderQuantity_TIME_SECONDS; }
62 };
63
64 autoLongSound LongSound_open (MelderFile file);
65
66 autoSound LongSound_extractPart (LongSound me, double tmin, double tmax, bool preserveTimes);
67
68 bool LongSound_haveWindow (LongSound me, double tmin, double tmax);
69 /*
70 * Returns 0 if error or if window exceeds buffer, otherwise 1;
71 */
72
73 void LongSound_getWindowExtrema (LongSound me, double tmin, double tmax, integer channel, double *minimum, double *maximum);
74
75 void LongSound_playPart (LongSound me, double tmin, double tmax,
76 Sound_PlayCallback callback, Thing boss);
77
78 void LongSound_savePartAsAudioFile (LongSound me, int audioFileType, double tmin, double tmax, MelderFile file, int numberOfBitsPerSamplePoint);
79 void LongSound_saveChannelAsAudioFile (LongSound me, int audioFileType, integer channel, MelderFile file);
80
81 void LongSound_readAudioToFloat (LongSound me, MAT buffer, integer firstSample);
82 void LongSound_readAudioToShort (LongSound me, int16 *buffer, integer firstSample, integer numberOfSamples);
83
Collection_define(SoundAndLongSoundList,OrderedOf,Sampled)84 Collection_define (SoundAndLongSoundList, OrderedOf, Sampled) {
85 };
86
87 void LongSound_concatenate (SoundAndLongSoundList collection, MelderFile file, int audioFileType, int numberOfBitsPerSamplePoint);
88
89 void LongSound_preferences ();
90 integer LongSound_getBufferSizePref_seconds ();
91 void LongSound_setBufferSizePref_seconds (integer size);
92
93 /* End of file LongSound.h */
94 #endif
95