.. index:: pair: class; EE::Audio::SoundFileReader .. _doxid-class_e_e_1_1_audio_1_1_sound_file_reader: class EE::Audio::SoundFileReader ================================ .. toctree:: :hidden: struct_EE_Audio_SoundFileReader_Info.rst Overview ~~~~~~~~ Abstract base class for sound file decoding. :ref:`More...` .. ref-code-block:: cpp :class: doxyrest-overview-code-block #include class SoundFileReader { public: // structs struct :ref:`Info`; // construction virtual :target:`~SoundFileReader`(); // methods virtual bool :ref:`open`(:ref:`IOStream`& stream, :ref:`Info`& info) = 0; virtual void :ref:`seek`(:ref:`Uint64` sampleOffset) = 0; virtual :ref:`Uint64` :ref:`read`(:ref:`Int16`* samples, :ref:`Uint64` maxCount) = 0; }; .. _details-class_e_e_1_1_audio_1_1_sound_file_reader: Detailed Documentation ~~~~~~~~~~~~~~~~~~~~~~ Abstract base class for sound file decoding. This class allows users to read audio file formats not natively supported by EEPP, and thus extend the set of supported readable audio formats. A valid sound file reader must override the open, seek and write functions, as well as providing a static check function; the latter is used by EEPP to find a suitable writer for a given input file. To register a new reader, use the :ref:`SoundFileFactory::registerReader ` template function. Usage example: .. ref-code-block:: cpp class MySoundFileReader : public SoundFileReader { public: static bool check(IOStream& stream) { // typically, read the first few header bytes and check fields that identify the format // return true if the reader can handle the format } virtual bool open(IOStream& stream, Info& info) { // read the sound file header and fill the sound attributes // (channel count, sample count and sample rate) // return true on success } virtual void seek(Uint64 sampleOffset) { // advance to the sampleOffset-th sample from the beginning of the sound } virtual Uint64 read(Int16* samples, Uint64 maxCount) { // read up to 'maxCount' samples into the 'samples' array, // convert them (for example from normalized float) if they are not stored // as 16-bits signed integers in the file // return the actual number of samples read } }; SoundFileFactory::registerReader(); .. rubric:: See also: :ref:`InputSoundFile `, :ref:`SoundFileFactory `, :ref:`SoundFileWriter ` Methods ------- .. index:: pair: function; open .. _doxid-class_e_e_1_1_audio_1_1_sound_file_reader_1a114e8f0e35127f91c6707bb98b95a544: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual bool open(:ref:`IOStream`& stream, :ref:`Info`& info) = 0 Open a sound file for reading. The provided stream reference is valid as long as the :ref:`SoundFileReader ` is alive, so it is safe to use/store it during the whole lifetime of the reader. .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - stream - Source stream to read from * - info - Structure to fill with the properties of the loaded sound .. rubric:: Returns: True if the file was successfully opened .. index:: pair: function; seek .. _doxid-class_e_e_1_1_audio_1_1_sound_file_reader_1a1c037b661652e33e3fc0d65503c1ef99: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual void seek(:ref:`Uint64` sampleOffset) = 0 Change the current read position to the given sample offset. The sample offset takes the channels into account. If you have a time offset instead, you can easily find the corresponding sample offset with the following formula: ``timeInSeconds * sampleRate * channelCount`` If the given offset exceeds to total number of samples, this function must jump to the end of the file. .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - sampleOffset - Index of the sample to jump to, relative to the beginning .. index:: pair: function; read .. _doxid-class_e_e_1_1_audio_1_1_sound_file_reader_1aefb59a08ec3d7713c81accd1e4f4e339: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual :ref:`Uint64` read(:ref:`Int16`* samples, :ref:`Uint64` maxCount) = 0 Read audio samples from the open file. .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - samples - Pointer to the sample array to fill * - maxCount - Maximum number of samples to read .. rubric:: Returns: Number of samples actually read (may be less than *maxCount*)