1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
|
/*
* Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
* (C) 2020 Vladimir Sadovnikov <sadko4u@gmail.com>
*
* This file is part of lsp-runtime-lib
* Created on: 6 нояб. 2018 г.
*
* lsp-runtime-lib is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* lsp-runtime-lib is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with lsp-runtime-lib. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef LSP_PLUG_IN_FMT_LSPC_AUDIOREADER_H_
#define LSP_PLUG_IN_FMT_LSPC_AUDIOREADER_H_
#include <lsp-plug.in/runtime/version.h>
#include <lsp-plug.in/common/types.h>
#include <lsp-plug.in/common/status.h>
#include <lsp-plug.in/fmt/lspc/File.h>
#include <lsp-plug.in/fmt/lspc/lspc.h>
namespace lsp
{
namespace lspc
{
/**
* This is helper class for reading audio content from LSPC files.
*/
class AudioReader
{
private:
AudioReader & operator = (const AudioReader &);
private:
enum flags_t
{
F_OPENED = 1 << 0,
F_CLOSE_READER = 1 << 1,
F_CLOSE_FILE = 1 << 2,
F_REV_BYTES = 1 << 3,
F_DROP_READER = 1 << 4
};
typedef struct buffer_t
{
uint8_t *vData; // Pointer to the data
size_t nSize; // Size of data stored in buffer
size_t nOff; // Offset to the beginning of non-read data
} buffer_t;
typedef void (*decode_func_t)(float *vp, const void *src, size_t ns);
private:
audio_parameters_t sParams;
File *pFD;
ChunkReader *pRD;
size_t nFlags;
size_t nBPS; // Bytes per sample
size_t nFrameSize; // Size of frame
size_t nBytesLeft;
buffer_t sBuf;
decode_func_t pDecode;
float *pFBuffer; // frame buffer
protected:
static void decode_u8(float *vp, const void *src, size_t ns);
static void decode_s8(float *vp, const void *src, size_t ns);
static void decode_u16(float *vp, const void *src, size_t ns);
static void decode_s16(float *vp, const void *src, size_t ns);
static void decode_u24le(float *vp, const void *src, size_t ns);
static void decode_u24be(float *vp, const void *src, size_t ns);
static void decode_s24le(float *vp, const void *src, size_t ns);
static void decode_s24be(float *vp, const void *src, size_t ns);
static void decode_u32(float *vp, const void *src, size_t ns);
static void decode_s32(float *vp, const void *src, size_t ns);
static void decode_f32(float *vp, const void *src, size_t ns);
static void decode_f64(float *vp, const void *src, size_t ns);
protected:
status_t read_audio_header(ChunkReader *rd);
status_t apply_params(const audio_parameters_t *p);
status_t fill_buffer();
public:
explicit AudioReader();
~AudioReader();
public:
/**
* Find first audio chunk and open it for reading
* @param lspc opened LSPC file
* @param auto_close automatically close reader on close()
* @return status of operation
*/
status_t open(File *lspc, bool auto_close = false);
/**
* Find audio chunk by ID and read it
* @param lspc opened LSPC file
* @param uid unique chunk identifier
* @param auto_close automatically close reader on close()
* @return status of operation
*/
status_t open(File *lspc, uint32_t uid, bool auto_close = false);
/**
* Find first audio chunk by magic and open it as audio stream with specified parameters
* @param lspc opened LSPC file
* @param magic chunk magic identifier
* @param params audio parameters
* @param auto_close automatically close reader on close()
* @return status of operation
*/
status_t open_raw_magic(File *lspc, const audio_parameters_t *params, uint32_t magic, bool auto_close = false);
/**
* Open audio chunk by UID as audio stream with specified parameters
* @param lspc opened LSPC file
* @param uid unique chunk identifier
* @param params audio parameters
* @param auto_close automatically close reader on close()
* @return status of operation
*/
status_t open_raw_uid(File *lspc, const audio_parameters_t *params, uint32_t uid, bool auto_close = false);
/**
* Open audio chunk as sub-stream of audio stream with specified parameters
* @param rd chunk reader
* @param params audio parameers
* @param auto_close automatically close reader on close()
* @return status of operation
*/
status_t open_raw(ChunkReader *rd, const audio_parameters_t *params, bool auto_close = false);
/**
* Close audio reader
* @return status of operation
*/
status_t close();
/**
* Read sample data from chunk
*
* @param data array of pointers to store data, must match number of channels in the stream
* @param frames number of frames to read
* @return number of frames actually read or error code as a negative value (0 or STATUS_EOF if there is no data)
*/
ssize_t read_samples(float **data, size_t frames);
/**
* Read frames from chunk
* @param data buffer to store data
* @param frames number of frames to read
* @return actual number of frames read or error code as a negative value (0 or STATUS_EOF if there is no data)
*/
ssize_t read_frames(float *data, size_t frames);
/**
* Skip number of frames
* @param frames number of frames to skip
* @return number of frames actually skipped
*/
ssize_t skip_frames(size_t frames);
/**
* Obtain current audio parameters of the stream
* @param dst pointer to store audio parameters
* @return status of operation
*/
status_t get_parameters(audio_parameters_t *dst) const;
/**
* Get current chunk identifier
* @return current chunk identifier
*/
uint32_t unique_id() const;
/**
* Get current chunk magic
* @return current chunk magic
*/
uint32_t magic() const;
};
}
} /* namespace lsp */
#endif /* LSP_PLUG_IN_FMT_LSPC_AUDIOREADER_H_ */
|