123#define DRWAV_STRINGIFY(x) #x
124#define DRWAV_XSTRINGIFY(x) DRWAV_STRINGIFY(x)
126#define DRWAV_VERSION_MAJOR 0
127#define DRWAV_VERSION_MINOR 13
128#define DRWAV_VERSION_REVISION 2
129#define DRWAV_VERSION_STRING DRWAV_XSTRINGIFY(DRWAV_VERSION_MAJOR) "." DRWAV_XSTRINGIFY(DRWAV_VERSION_MINOR) "." DRWAV_XSTRINGIFY(DRWAV_VERSION_REVISION)
140#if defined(_MSC_VER) && !defined(__clang__)
144 #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))
145 #pragma GCC diagnostic push
146 #pragma GCC diagnostic ignored "-Wlong-long"
147 #if defined(__clang__)
148 #pragma GCC diagnostic ignored "-Wc++11-long-long"
153 #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))
154 #pragma GCC diagnostic pop
157#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(_M_ARM64) || defined(__powerpc64__)
167#if !defined(DRWAV_API)
168 #if defined(DRWAV_DLL)
170 #define DRWAV_DLL_IMPORT __declspec(dllimport)
171 #define DRWAV_DLL_EXPORT __declspec(dllexport)
172 #define DRWAV_DLL_PRIVATE static
174 #if defined(__GNUC__) && __GNUC__ >= 4
175 #define DRWAV_DLL_IMPORT __attribute__((visibility("default")))
176 #define DRWAV_DLL_EXPORT __attribute__((visibility("default")))
177 #define DRWAV_DLL_PRIVATE __attribute__((visibility("hidden")))
179 #define DRWAV_DLL_IMPORT
180 #define DRWAV_DLL_EXPORT
181 #define DRWAV_DLL_PRIVATE static
185 #if defined(DR_WAV_IMPLEMENTATION) || defined(DRWAV_IMPLEMENTATION)
186 #define DRWAV_API DRWAV_DLL_EXPORT
188 #define DRWAV_API DRWAV_DLL_IMPORT
190 #define DRWAV_PRIVATE DRWAV_DLL_PRIVATE
192 #define DRWAV_API extern
193 #define DRWAV_PRIVATE static
198#define DRWAV_SUCCESS 0
199#define DRWAV_ERROR -1
200#define DRWAV_INVALID_ARGS -2
201#define DRWAV_INVALID_OPERATION -3
202#define DRWAV_OUT_OF_MEMORY -4
203#define DRWAV_OUT_OF_RANGE -5
204#define DRWAV_ACCESS_DENIED -6
205#define DRWAV_DOES_NOT_EXIST -7
206#define DRWAV_ALREADY_EXISTS -8
207#define DRWAV_TOO_MANY_OPEN_FILES -9
208#define DRWAV_INVALID_FILE -10
209#define DRWAV_TOO_BIG -11
210#define DRWAV_PATH_TOO_LONG -12
211#define DRWAV_NAME_TOO_LONG -13
212#define DRWAV_NOT_DIRECTORY -14
213#define DRWAV_IS_DIRECTORY -15
214#define DRWAV_DIRECTORY_NOT_EMPTY -16
215#define DRWAV_END_OF_FILE -17
216#define DRWAV_NO_SPACE -18
217#define DRWAV_BUSY -19
218#define DRWAV_IO_ERROR -20
219#define DRWAV_INTERRUPT -21
220#define DRWAV_UNAVAILABLE -22
221#define DRWAV_ALREADY_IN_USE -23
222#define DRWAV_BAD_ADDRESS -24
223#define DRWAV_BAD_SEEK -25
224#define DRWAV_BAD_PIPE -26
225#define DRWAV_DEADLOCK -27
226#define DRWAV_TOO_MANY_LINKS -28
227#define DRWAV_NOT_IMPLEMENTED -29
228#define DRWAV_NO_MESSAGE -30
229#define DRWAV_BAD_MESSAGE -31
230#define DRWAV_NO_DATA_AVAILABLE -32
231#define DRWAV_INVALID_DATA -33
232#define DRWAV_TIMEOUT -34
233#define DRWAV_NO_NETWORK -35
234#define DRWAV_NOT_UNIQUE -36
235#define DRWAV_NOT_SOCKET -37
236#define DRWAV_NO_ADDRESS -38
237#define DRWAV_BAD_PROTOCOL -39
238#define DRWAV_PROTOCOL_UNAVAILABLE -40
239#define DRWAV_PROTOCOL_NOT_SUPPORTED -41
240#define DRWAV_PROTOCOL_FAMILY_NOT_SUPPORTED -42
241#define DRWAV_ADDRESS_FAMILY_NOT_SUPPORTED -43
242#define DRWAV_SOCKET_NOT_SUPPORTED -44
243#define DRWAV_CONNECTION_RESET -45
244#define DRWAV_ALREADY_CONNECTED -46
245#define DRWAV_NOT_CONNECTED -47
246#define DRWAV_CONNECTION_REFUSED -48
247#define DRWAV_NO_HOST -49
248#define DRWAV_IN_PROGRESS -50
249#define DRWAV_CANCELLED -51
250#define DRWAV_MEMORY_ALREADY_MAPPED -52
251#define DRWAV_AT_END -53
254#define DR_WAVE_FORMAT_PCM 0x1
255#define DR_WAVE_FORMAT_ADPCM 0x2
256#define DR_WAVE_FORMAT_IEEE_FLOAT 0x3
257#define DR_WAVE_FORMAT_ALAW 0x6
258#define DR_WAVE_FORMAT_MULAW 0x7
259#define DR_WAVE_FORMAT_DVI_ADPCM 0x11
260#define DR_WAVE_FORMAT_EXTENSIBLE 0xFFFE
263#define DRWAV_SEQUENTIAL 0x00000001
354typedef size_t (*
drwav_read_proc)(
void* pUserData,
void* pBufferOut,
size_t bytesToRead);
367typedef size_t (*
drwav_write_proc)(
void* pUserData,
const void* pData,
size_t bytesToWrite);
1066#ifndef DR_WAV_NO_CONVERSION_API
1177#ifndef DR_WAV_NO_STDIO
1233#ifndef DR_WAV_NO_CONVERSION_API
1242#ifndef DR_WAV_NO_STDIO
1296#if defined(DR_WAV_IMPLEMENTATION) || defined(DRWAV_IMPLEMENTATION)
1304#ifndef DR_WAV_NO_STDIO
1312#define DRWAV_ASSERT(expression) assert(expression)
1315#define DRWAV_MALLOC(sz) malloc((sz))
1317#ifndef DRWAV_REALLOC
1318#define DRWAV_REALLOC(p, sz) realloc((p), (sz))
1321#define DRWAV_FREE(p) free((p))
1323#ifndef DRWAV_COPY_MEMORY
1324#define DRWAV_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))
1326#ifndef DRWAV_ZERO_MEMORY
1327#define DRWAV_ZERO_MEMORY(p, sz) memset((p), 0, (sz))
1329#ifndef DRWAV_ZERO_OBJECT
1330#define DRWAV_ZERO_OBJECT(p) DRWAV_ZERO_MEMORY((p), sizeof(*p))
1333#define drwav_countof(x) (sizeof(x) / sizeof(x[0]))
1334#define drwav_align(x, a) ((((x) + (a) - 1) / (a)) * (a))
1335#define drwav_min(a, b) (((a) < (b)) ? (a) : (b))
1336#define drwav_max(a, b) (((a) > (b)) ? (a) : (b))
1337#define drwav_clamp(x, lo, hi) (drwav_max((lo), drwav_min((hi), (x))))
1339#define DRWAV_MAX_SIMD_VECTOR_SIZE 64
1342#if defined(__x86_64__) || defined(_M_X64)
1344#elif defined(__i386) || defined(_M_IX86)
1346#elif defined(__arm__) || defined(_M_ARM)
1351 #define DRWAV_INLINE __forceinline
1352#elif defined(__GNUC__)
1360 #if defined(__STRICT_ANSI__)
1361 #define DRWAV_INLINE __inline__ __attribute__((always_inline))
1363 #define DRWAV_INLINE inline __attribute__((always_inline))
1365#elif defined(__WATCOMC__)
1366 #define DRWAV_INLINE __inline
1368 #define DRWAV_INLINE
1371#if defined(SIZE_MAX)
1372 #define DRWAV_SIZE_MAX SIZE_MAX
1374 #if defined(_WIN64) || defined(_LP64) || defined(__LP64__)
1375 #define DRWAV_SIZE_MAX ((drwav_uint64)0xFFFFFFFFFFFFFFFF)
1377 #define DRWAV_SIZE_MAX 0xFFFFFFFF
1381#if defined(_MSC_VER) && _MSC_VER >= 1400
1382 #define DRWAV_HAS_BYTESWAP16_INTRINSIC
1383 #define DRWAV_HAS_BYTESWAP32_INTRINSIC
1384 #define DRWAV_HAS_BYTESWAP64_INTRINSIC
1385#elif defined(__clang__)
1386 #if defined(__has_builtin)
1387 #if __has_builtin(__builtin_bswap16)
1388 #define DRWAV_HAS_BYTESWAP16_INTRINSIC
1390 #if __has_builtin(__builtin_bswap32)
1391 #define DRWAV_HAS_BYTESWAP32_INTRINSIC
1393 #if __has_builtin(__builtin_bswap64)
1394 #define DRWAV_HAS_BYTESWAP64_INTRINSIC
1397#elif defined(__GNUC__)
1398 #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
1399 #define DRWAV_HAS_BYTESWAP32_INTRINSIC
1400 #define DRWAV_HAS_BYTESWAP64_INTRINSIC
1402 #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))
1403 #define DRWAV_HAS_BYTESWAP16_INTRINSIC
1431#ifndef DRWAV_MAX_SAMPLE_RATE
1432#define DRWAV_MAX_SAMPLE_RATE 384000
1434#ifndef DRWAV_MAX_CHANNELS
1435#define DRWAV_MAX_CHANNELS 256
1437#ifndef DRWAV_MAX_BITS_PER_SAMPLE
1438#define DRWAV_MAX_BITS_PER_SAMPLE 64
1441static const drwav_uint8 drwavGUID_W64_RIFF[16] = {0x72,0x69,0x66,0x66, 0x2E,0x91, 0xCF,0x11, 0xA5,0xD6, 0x28,0xDB,0x04,0xC1,0x00,0x00};
1442static const drwav_uint8 drwavGUID_W64_WAVE[16] = {0x77,0x61,0x76,0x65, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A};
1444static const drwav_uint8 drwavGUID_W64_FMT [16] = {0x66,0x6D,0x74,0x20, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A};
1445static const drwav_uint8 drwavGUID_W64_FACT[16] = {0x66,0x61,0x63,0x74, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A};
1446static const drwav_uint8 drwavGUID_W64_DATA[16] = {0x64,0x61,0x74,0x61, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A};
1450static DRWAV_INLINE
int drwav__is_little_endian(
void)
1452#if defined(DRWAV_X86) || defined(DRWAV_X64)
1454#elif defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN
1458 return (*(
char*)&
n) == 1;
1466 for (
i = 0;
i < 16; ++
i) {
1474#ifdef DRWAV_HAS_BYTESWAP16_INTRINSIC
1475 #if defined(_MSC_VER)
1476 return _byteswap_ushort(
n);
1477 #elif defined(__GNUC__) || defined(__clang__)
1478 return __builtin_bswap16(
n);
1480 #error "This compiler does not support the byte swap intrinsic."
1483 return ((
n & 0xFF00) >> 8) |
1484 ((
n & 0x00FF) << 8);
1490#ifdef DRWAV_HAS_BYTESWAP32_INTRINSIC
1491 #if defined(_MSC_VER)
1492 return _byteswap_ulong(
n);
1493 #elif defined(__GNUC__) || defined(__clang__)
1494 #if defined(DRWAV_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 6) && !defined(DRWAV_64BIT)
1497 __asm__ __volatile__ (
1498 #
if defined(DRWAV_64BIT)
1499 "rev %w[out], %w[in]" : [
out]
"=r"(
r) : [
in]
"r"(
n)
1501 "rev %[out], %[in]" : [
out]
"=r"(
r) : [
in]
"r"(
n)
1506 return __builtin_bswap32(
n);
1509 #error "This compiler does not support the byte swap intrinsic."
1512 return ((
n & 0xFF000000) >> 24) |
1513 ((
n & 0x00FF0000) >> 8) |
1514 ((
n & 0x0000FF00) << 8) |
1515 ((
n & 0x000000FF) << 24);
1521#ifdef DRWAV_HAS_BYTESWAP64_INTRINSIC
1522 #if defined(_MSC_VER)
1523 return _byteswap_uint64(
n);
1524 #elif defined(__GNUC__) || defined(__clang__)
1525 return __builtin_bswap64(
n);
1527 #error "This compiler does not support the byte swap intrinsic."
1551 for (iSample = 0; iSample < sampleCount; iSample += 1) {
1552 pSamples[iSample] = drwav__bswap_s16(pSamples[iSample]);
1557static DRWAV_INLINE
void drwav__bswap_s24(
drwav_uint8*
p)
1568 for (iSample = 0; iSample < sampleCount; iSample += 1) {
1570 drwav__bswap_s24(pSample);
1583 for (iSample = 0; iSample < sampleCount; iSample += 1) {
1584 pSamples[iSample] = drwav__bswap_s32(pSamples[iSample]);
1589static DRWAV_INLINE
float drwav__bswap_f32(
float n)
1596 x.i = drwav__bswap32(
x.i);
1601static DRWAV_INLINE
void drwav__bswap_samples_f32(
float* pSamples,
drwav_uint64 sampleCount)
1604 for (iSample = 0; iSample < sampleCount; iSample += 1) {
1605 pSamples[iSample] = drwav__bswap_f32(pSamples[iSample]);
1610static DRWAV_INLINE
double drwav__bswap_f64(
double n)
1617 x.i = drwav__bswap64(
x.i);
1622static DRWAV_INLINE
void drwav__bswap_samples_f64(
double* pSamples,
drwav_uint64 sampleCount)
1625 for (iSample = 0; iSample < sampleCount; iSample += 1) {
1626 pSamples[iSample] = drwav__bswap_f64(pSamples[iSample]);
1631static DRWAV_INLINE
void drwav__bswap_samples_pcm(
void* pSamples,
drwav_uint64 sampleCount,
drwav_uint32 bytesPerSample)
1634 switch (bytesPerSample)
1638 drwav__bswap_samples_s16((
drwav_int16*)pSamples, sampleCount);
1642 drwav__bswap_samples_s24((
drwav_uint8*)pSamples, sampleCount);
1646 drwav__bswap_samples_s32((
drwav_int32*)pSamples, sampleCount);
1656static DRWAV_INLINE
void drwav__bswap_samples_ieee(
void* pSamples,
drwav_uint64 sampleCount,
drwav_uint32 bytesPerSample)
1658 switch (bytesPerSample)
1663 drwav__bswap_samples_f16((drwav_float16*)pSamples, sampleCount);
1668 drwav__bswap_samples_f32((
float*)pSamples, sampleCount);
1672 drwav__bswap_samples_f64((
double*)pSamples, sampleCount);
1688 drwav__bswap_samples_pcm(pSamples, sampleCount, bytesPerSample);
1693 drwav__bswap_samples_ieee(pSamples, sampleCount, bytesPerSample);
1699 drwav__bswap_samples_s16((
drwav_int16*)pSamples, sampleCount);
1713DRWAV_PRIVATE void* drwav__malloc_default(
size_t sz,
void* pUserData)
1716 return DRWAV_MALLOC(sz);
1719DRWAV_PRIVATE void* drwav__realloc_default(
void*
p,
size_t sz,
void* pUserData)
1722 return DRWAV_REALLOC(
p, sz);
1734 if (pAllocationCallbacks ==
NULL) {
1752 if (pAllocationCallbacks ==
NULL) {
1770 DRWAV_COPY_MEMORY(p2,
p, szOld);
1782 if (
p ==
NULL || pAllocationCallbacks ==
NULL) {
1794 if (pAllocationCallbacks !=
NULL) {
1796 return *pAllocationCallbacks;
1801 allocationCallbacks.
onMalloc = drwav__malloc_default;
1802 allocationCallbacks.
onRealloc = drwav__realloc_default;
1803 allocationCallbacks.
onFree = drwav__free_default;
1804 return allocationCallbacks;
1818 return (
unsigned int)(chunkSize % 2);
1823 return (
unsigned int)(chunkSize % 8);
1835 if (onRead(pUserData, pHeaderOut->
id.
fourcc, 4) != 4) {
1839 if (onRead(pUserData, sizeInBytes, 4) != 4) {
1845 *pRunningBytesReadOut += 8;
1849 if (onRead(pUserData, pHeaderOut->
id.
guid, 16) != 16) {
1853 if (onRead(pUserData, sizeInBytes, 8) != 8) {
1859 *pRunningBytesReadOut += 24;
1868 while (bytesRemainingToSeek > 0) {
1869 if (bytesRemainingToSeek > 0x7FFFFFFF) {
1873 bytesRemainingToSeek -= 0x7FFFFFFF;
1878 bytesRemainingToSeek = 0;
1887 if (offset <= 0x7FFFFFFF) {
1895 offset -= 0x7FFFFFFF;
1898 if (offset <= 0x7FFFFFFF) {
1905 offset -= 0x7FFFFFFF;
1918 if (drwav__read_chunk_header(onRead, pUserData, container, pRunningBytesReadOut, &header) !=
DRWAV_SUCCESS) {
1931 if (drwav__read_chunk_header(onRead, pUserData, container, pRunningBytesReadOut, &header) !=
DRWAV_SUCCESS) {
1949 if (onRead(pUserData,
fmt,
sizeof(
fmt)) !=
sizeof(
fmt)) {
1952 *pRunningBytesReadOut +=
sizeof(
fmt);
1968 int bytesReadSoFar = 0;
1970 if (onRead(pUserData, fmt_cbSize,
sizeof(fmt_cbSize)) !=
sizeof(fmt_cbSize)) {
1973 *pRunningBytesReadOut +=
sizeof(fmt_cbSize);
1975 bytesReadSoFar = 18;
1994 drwav_bytes_to_guid(fmtext + 6, fmtOut->
subFormat);
2009 *pRunningBytesReadOut += (header.
sizeInBytes - bytesReadSoFar);
2027 DRWAV_ASSERT(onRead !=
NULL);
2028 DRWAV_ASSERT(pCursor !=
NULL);
2030 bytesRead = onRead(pUserData, pBufferOut, bytesToRead);
2031 *pCursor += bytesRead;
2038 DRWAV_ASSERT(onSeek !=
NULL);
2039 DRWAV_ASSERT(pCursor !=
NULL);
2041 if (!onSeek(pUserData, offset, origin)) {
2056#define DRWAV_SMPL_BYTES 36
2057#define DRWAV_SMPL_LOOP_BYTES 24
2058#define DRWAV_INST_BYTES 7
2059#define DRWAV_ACID_BYTES 24
2060#define DRWAV_CUE_BYTES 4
2061#define DRWAV_BEXT_BYTES 602
2062#define DRWAV_BEXT_DESCRIPTION_BYTES 256
2063#define DRWAV_BEXT_ORIGINATOR_NAME_BYTES 32
2064#define DRWAV_BEXT_ORIGINATOR_REF_BYTES 32
2065#define DRWAV_BEXT_RESERVED_BYTES 180
2066#define DRWAV_BEXT_UMID_BYTES 64
2067#define DRWAV_CUE_POINT_BYTES 24
2068#define DRWAV_LIST_LABEL_OR_NOTE_BYTES 4
2069#define DRWAV_LIST_LABELLED_TEXT_BYTES 20
2071#define DRWAV_METADATA_ALIGNMENT 8
2075 drwav__metadata_parser_stage_count,
2076 drwav__metadata_parser_stage_read
2077} drwav__metadata_parser_stage;
2083 void *pReadSeekUserData;
2084 drwav__metadata_parser_stage stage;
2091} drwav__metadata_parser;
2093DRWAV_PRIVATE size_t drwav__metadata_memory_capacity(drwav__metadata_parser* pParser)
2096 if (cap > DRWAV_SIZE_MAX) {
2110 pParser->pDataCursor += align - modulo;
2114 pResult = pParser->pDataCursor;
2120 DRWAV_ASSERT((pResult +
size) <= (pParser->pData + drwav__metadata_memory_capacity(pParser)));
2122 pParser->pDataCursor +=
size;
2126DRWAV_PRIVATE void drwav__metadata_request_extra_memory_for_stage_2(drwav__metadata_parser* pParser,
size_t bytes,
size_t align)
2128 size_t extra = bytes + (align ? (align - 1) : 0);
2129 pParser->extraCapacity += extra;
2134 if (pParser->extraCapacity != 0 || pParser->metadataCount != 0) {
2135 free(pParser->pData);
2137 pParser->pData = (
drwav_uint8*)pAllocationCallbacks->
onMalloc(drwav__metadata_memory_capacity(pParser), pAllocationCallbacks->
pUserData);
2138 pParser->pDataCursor = pParser->pData;
2140 if (pParser->pData ==
NULL) {
2150 pParser->metadataCursor = 0;
2156DRWAV_PRIVATE size_t drwav__metadata_parser_read(drwav__metadata_parser* pParser,
void* pBufferOut,
size_t bytesToRead,
drwav_uint64* pCursor)
2158 if (pCursor !=
NULL) {
2159 return drwav__on_read(pParser->onRead, pParser->pReadSeekUserData, pBufferOut, bytesToRead, pCursor);
2161 return pParser->onRead(pParser->pReadSeekUserData, pBufferOut, bytesToRead);
2169 size_t bytesJustRead = drwav__metadata_parser_read(pParser, smplHeaderData,
sizeof(smplHeaderData), &totalBytesRead);
2171 DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read);
2173 if (bytesJustRead ==
sizeof(smplHeaderData)) {
2190 bytesJustRead = drwav__metadata_parser_read(pParser, smplLoopData,
sizeof(smplLoopData), &totalBytesRead);
2192 if (bytesJustRead ==
sizeof(smplLoopData)) {
2212 return totalBytesRead;
2217 drwav_uint8 cueHeaderSectionData[DRWAV_CUE_BYTES];
2219 size_t bytesJustRead = drwav__metadata_parser_read(pParser, cueHeaderSectionData,
sizeof(cueHeaderSectionData), &totalBytesRead);
2221 DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read);
2223 if (bytesJustRead ==
sizeof(cueHeaderSectionData)) {
2234 bytesJustRead = drwav__metadata_parser_read(pParser, cuePointData,
sizeof(cuePointData), &totalBytesRead);
2236 if (bytesJustRead ==
sizeof(cuePointData)) {
2253 return totalBytesRead;
2259 drwav_uint64 bytesRead = drwav__metadata_parser_read(pParser, instData,
sizeof(instData),
NULL);
2261 DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read);
2263 if (bytesRead ==
sizeof(instData)) {
2280 drwav_uint64 bytesRead = drwav__metadata_parser_read(pParser, acidData,
sizeof(acidData),
NULL);
2282 DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read);
2284 if (bytesRead ==
sizeof(acidData)) {
2299DRWAV_PRIVATE size_t drwav__strlen_clamped(
char* str,
size_t maxToRead)
2303 while (*str++ &&
result < maxToRead) {
2310DRWAV_PRIVATE char* drwav__metadata_copy_string(drwav__metadata_parser* pParser,
char* str,
size_t maxToRead)
2312 size_t len = drwav__strlen_clamped(str, maxToRead);
2315 char*
result = (
char*)drwav__metadata_get_memory(pParser, len + 1, 1);
2330 drwav_uint64 bytesRead = drwav__metadata_parser_read(pParser, bextData,
sizeof(bextData),
NULL);
2332 DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read);
2334 if (bytesRead ==
sizeof(bextData)) {
2342 pReadPointer = bextData;
2343 pMetadata->
data.
bext.
pDescription = drwav__metadata_copy_string(pParser, (
char*)(pReadPointer), DRWAV_BEXT_DESCRIPTION_BYTES);
2344 pReadPointer += DRWAV_BEXT_DESCRIPTION_BYTES;
2346 pMetadata->
data.
bext.
pOriginatorName = drwav__metadata_copy_string(pParser, (
char*)(pReadPointer), DRWAV_BEXT_ORIGINATOR_NAME_BYTES);
2347 pReadPointer += DRWAV_BEXT_ORIGINATOR_NAME_BYTES;
2349 pMetadata->
data.
bext.
pOriginatorReference = drwav__metadata_copy_string(pParser, (
char*)(pReadPointer), DRWAV_BEXT_ORIGINATOR_REF_BYTES);
2350 pReadPointer += DRWAV_BEXT_ORIGINATOR_REF_BYTES;
2367 pMetadata->
data.
bext.
pUMID = drwav__metadata_get_memory(pParser, DRWAV_BEXT_UMID_BYTES, 1);
2369 pReadPointer += DRWAV_BEXT_UMID_BYTES;
2386 DRWAV_ASSERT((pReadPointer + DRWAV_BEXT_RESERVED_BYTES) == (bextData + DRWAV_BEXT_BYTES));
2388 extraBytes = (size_t)(chunkSize - DRWAV_BEXT_BYTES);
2389 if (extraBytes > 0) {
2406 drwav_uint8 cueIDBuffer[DRWAV_LIST_LABEL_OR_NOTE_BYTES];
2408 size_t bytesJustRead = drwav__metadata_parser_read(pParser, cueIDBuffer,
sizeof(cueIDBuffer), &totalBytesRead);
2410 DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read);
2412 if (bytesJustRead ==
sizeof(cueIDBuffer)) {
2418 sizeIncludingNullTerminator = (
drwav_uint32)chunkSize - DRWAV_LIST_LABEL_OR_NOTE_BYTES;
2419 if (sizeIncludingNullTerminator > 0) {
2421 pMetadata->
data.
labelOrNote.
pString = (
char*)drwav__metadata_get_memory(pParser, sizeIncludingNullTerminator, 1);
2424 bytesJustRead = drwav__metadata_parser_read(pParser, pMetadata->
data.
labelOrNote.
pString, sizeIncludingNullTerminator, &totalBytesRead);
2431 return totalBytesRead;
2438 size_t bytesJustRead = drwav__metadata_parser_read(pParser, buffer,
sizeof(buffer), &totalBytesRead);
2440 DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read);
2442 if (bytesJustRead ==
sizeof(buffer)) {
2457 sizeIncludingNullTerminator = (
drwav_uint32)chunkSize - DRWAV_LIST_LABELLED_TEXT_BYTES;
2458 if (sizeIncludingNullTerminator > 0) {
2463 bytesJustRead = drwav__metadata_parser_read(pParser, pMetadata->
data.
labelledCueRegion.
pString, sizeIncludingNullTerminator, &totalBytesRead);
2470 return totalBytesRead;
2478 if (pParser->stage == drwav__metadata_parser_stage_count) {
2479 pParser->metadataCount += 1;
2480 drwav__metadata_request_extra_memory_for_stage_2(pParser, stringSizeWithNullTerminator, 1);
2482 drwav_metadata* pMetadata = &pParser->pMetadata[pParser->metadataCursor];
2484 if (stringSizeWithNullTerminator > 0) {
2486 pMetadata->
data.
infoText.
pString = (
char*)drwav__metadata_get_memory(pParser, stringSizeWithNullTerminator, 1);
2489 bytesRead = drwav__metadata_parser_read(pParser, pMetadata->
data.
infoText.
pString, (
size_t)stringSizeWithNullTerminator,
NULL);
2490 if (bytesRead == chunkSize) {
2491 pParser->metadataCursor += 1;
2498 pParser->metadataCursor += 1;
2517 if (pParser->stage == drwav__metadata_parser_stage_count) {
2518 pParser->metadataCount += 1;
2519 drwav__metadata_request_extra_memory_for_stage_2(pParser, (
size_t)chunkSize, 1);
2521 drwav_metadata* pMetadata = &pParser->pMetadata[pParser->metadataCursor];
2534 pParser->metadataCursor += 1;
2554 if (pChunkHeader->
sizeInBytes >= DRWAV_SMPL_BYTES) {
2555 if (pParser->stage == drwav__metadata_parser_stage_count) {
2557 size_t bytesJustRead;
2564 bytesJustRead = drwav__metadata_parser_read(pParser, buffer,
sizeof(buffer), &bytesRead);
2565 if (bytesJustRead ==
sizeof(buffer)) {
2568 bytesJustRead = drwav__metadata_parser_read(pParser, buffer,
sizeof(buffer), &bytesRead);
2569 if (bytesJustRead ==
sizeof(buffer)) {
2572 pParser->metadataCount += 1;
2573 drwav__metadata_request_extra_memory_for_stage_2(pParser,
sizeof(
drwav_smpl_loop) * loopCount, DRWAV_METADATA_ALIGNMENT);
2574 drwav__metadata_request_extra_memory_for_stage_2(pParser, samplerSpecificDataSizeInBytes, 1);
2578 bytesRead = drwav__read_smpl_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor]);
2580 pParser->metadataCursor += 1;
2589 if (pChunkHeader->
sizeInBytes == DRWAV_INST_BYTES) {
2590 if (pParser->stage == drwav__metadata_parser_stage_count) {
2591 pParser->metadataCount += 1;
2593 bytesRead = drwav__read_inst_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor]);
2595 pParser->metadataCursor += 1;
2604 if (pChunkHeader->
sizeInBytes == DRWAV_ACID_BYTES) {
2605 if (pParser->stage == drwav__metadata_parser_stage_count) {
2606 pParser->metadataCount += 1;
2608 bytesRead = drwav__read_acid_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor]);
2610 pParser->metadataCursor += 1;
2619 if (pChunkHeader->
sizeInBytes >= DRWAV_CUE_BYTES) {
2620 if (pParser->stage == drwav__metadata_parser_stage_count) {
2623 pParser->metadataCount += 1;
2624 cueCount = (size_t)(pChunkHeader->
sizeInBytes - DRWAV_CUE_BYTES) / DRWAV_CUE_POINT_BYTES;
2625 drwav__metadata_request_extra_memory_for_stage_2(pParser,
sizeof(
drwav_cue_point) * cueCount, DRWAV_METADATA_ALIGNMENT);
2627 bytesRead = drwav__read_cue_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor]);
2629 pParser->metadataCursor += 1;
2638 if (pChunkHeader->
sizeInBytes >= DRWAV_BEXT_BYTES) {
2639 if (pParser->stage == drwav__metadata_parser_stage_count) {
2641 char buffer[DRWAV_BEXT_DESCRIPTION_BYTES + 1];
2642 size_t allocSizeNeeded = DRWAV_BEXT_UMID_BYTES;
2643 size_t bytesJustRead;
2645 buffer[DRWAV_BEXT_DESCRIPTION_BYTES] =
'\0';
2646 bytesJustRead = drwav__metadata_parser_read(pParser, buffer, DRWAV_BEXT_DESCRIPTION_BYTES, &bytesRead);
2647 if (bytesJustRead != DRWAV_BEXT_DESCRIPTION_BYTES) {
2650 allocSizeNeeded += strlen(buffer) + 1;
2652 buffer[DRWAV_BEXT_ORIGINATOR_NAME_BYTES] =
'\0';
2653 bytesJustRead = drwav__metadata_parser_read(pParser, buffer, DRWAV_BEXT_ORIGINATOR_NAME_BYTES, &bytesRead);
2654 if (bytesJustRead != DRWAV_BEXT_ORIGINATOR_NAME_BYTES) {
2657 allocSizeNeeded += strlen(buffer) + 1;
2659 buffer[DRWAV_BEXT_ORIGINATOR_REF_BYTES] =
'\0';
2660 bytesJustRead = drwav__metadata_parser_read(pParser, buffer, DRWAV_BEXT_ORIGINATOR_REF_BYTES, &bytesRead);
2661 if (bytesJustRead != DRWAV_BEXT_ORIGINATOR_REF_BYTES) {
2664 allocSizeNeeded += strlen(buffer) + 1;
2665 allocSizeNeeded += (size_t)pChunkHeader->
sizeInBytes - DRWAV_BEXT_BYTES;
2667 drwav__metadata_request_extra_memory_for_stage_2(pParser, allocSizeNeeded, 1);
2669 pParser->metadataCount += 1;
2671 bytesRead = drwav__read_bext_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor], pChunkHeader->
sizeInBytes);
2673 pParser->metadataCursor += 1;
2683 while (bytesRead < pChunkHeader->sizeInBytes) {
2688 drwav_uint64 bytesJustRead = drwav__metadata_parser_read(pParser, subchunkId,
sizeof(subchunkId), &bytesRead);
2689 if (bytesJustRead !=
sizeof(subchunkId)) {
2712 bytesJustRead = drwav__metadata_parser_read(pParser, subchunkSizeBuffer,
sizeof(subchunkSizeBuffer), &bytesRead);
2713 if (bytesJustRead !=
sizeof(subchunkSizeBuffer)) {
2719 if (subchunkDataSize >= DRWAV_LIST_LABEL_OR_NOTE_BYTES) {
2720 drwav_uint64 stringSizeWithNullTerm = subchunkDataSize - DRWAV_LIST_LABEL_OR_NOTE_BYTES;
2721 if (pParser->stage == drwav__metadata_parser_stage_count) {
2722 pParser->metadataCount += 1;
2723 drwav__metadata_request_extra_memory_for_stage_2(pParser, (
size_t)stringSizeWithNullTerm, 1);
2726 if (subchunkBytesRead == subchunkDataSize) {
2727 pParser->metadataCursor += 1;
2736 if (subchunkDataSize >= DRWAV_LIST_LABELLED_TEXT_BYTES) {
2737 drwav_uint64 stringSizeWithNullTerminator = subchunkDataSize - DRWAV_LIST_LABELLED_TEXT_BYTES;
2738 if (pParser->stage == drwav__metadata_parser_stage_count) {
2739 pParser->metadataCount += 1;
2740 drwav__metadata_request_extra_memory_for_stage_2(pParser, (
size_t)stringSizeWithNullTerminator, 1);
2742 subchunkBytesRead = drwav__read_list_labelled_cue_region_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor], subchunkDataSize);
2743 if (subchunkBytesRead == subchunkDataSize) {
2744 pParser->metadataCursor += 1;
2771 subchunkBytesRead = drwav__metadata_process_unknown_chunk(pParser, subchunkId, subchunkDataSize, listType);
2774 bytesRead += subchunkBytesRead;
2775 DRWAV_ASSERT(subchunkBytesRead <= subchunkDataSize);
2777 if (subchunkBytesRead < subchunkDataSize) {
2778 drwav_uint64 bytesToSeek = subchunkDataSize - subchunkBytesRead;
2783 bytesRead += bytesToSeek;
2786 if ((subchunkDataSize % 2) == 1) {
2823 return bytesPerFrame;
2841 if (pWav ==
NULL || onRead ==
NULL || onSeek ==
NULL) {
2845 DRWAV_ZERO_MEMORY(pWav,
sizeof(*pWav));
2849 pWav->
allocationCallbacks = drwav_copy_allocation_callbacks_or_defaults(pAllocationCallbacks);
2866 unsigned short translatedFormatTag;
2871 drwav__metadata_parser metadataParser;
2877 if (drwav__on_read(pWav->
onRead, pWav->
pUserData, riff,
sizeof(riff), &cursor) !=
sizeof(riff)) {
2894 if (drwav__on_read(pWav->
onRead, pWav->
pUserData, riff2,
sizeof(riff2), &cursor) !=
sizeof(riff2)) {
2898 for (
i = 0;
i < 12; ++
i) {
2899 if (riff2[
i] != drwavGUID_W64_RIFF[
i+4]) {
2915 if (drwav__on_read(pWav->
onRead, pWav->
pUserData, chunkSizeBytes,
sizeof(chunkSizeBytes), &cursor) !=
sizeof(chunkSizeBytes)) {
2929 if (drwav__on_read(pWav->
onRead, pWav->
pUserData, wave,
sizeof(wave), &cursor) !=
sizeof(wave)) {
2941 if (drwav__on_read(pWav->
onRead, pWav->
pUserData, chunkSizeBytes,
sizeof(chunkSizeBytes), &cursor) !=
sizeof(chunkSizeBytes)) {
2949 if (drwav__on_read(pWav->
onRead, pWav->
pUserData, wave,
sizeof(wave), &cursor) !=
sizeof(wave)) {
2979 bytesRemainingInChunk -= 8;
2984 if (drwav__on_read(pWav->
onRead, pWav->
pUserData, sizeBytes,
sizeof(sizeBytes), &cursor) !=
sizeof(sizeBytes)) {
2987 bytesRemainingInChunk -= 8;
2992 if (drwav__on_read(pWav->
onRead, pWav->
pUserData, sizeBytes,
sizeof(sizeBytes), &cursor) !=
sizeof(sizeBytes)) {
2995 bytesRemainingInChunk -= 8;
3000 if (!drwav__seek_forward(pWav->
onSeek, bytesRemainingInChunk, pWav->
pUserData)) {
3003 cursor += bytesRemainingInChunk;
3013 if ((
fmt.sampleRate == 0 ||
fmt.sampleRate > DRWAV_MAX_SAMPLE_RATE) ||
3014 (
fmt.channels == 0 ||
fmt.channels > DRWAV_MAX_CHANNELS) ||
3015 (
fmt.bitsPerSample == 0 ||
fmt.bitsPerSample > DRWAV_MAX_BITS_PER_SAMPLE) ||
3016 fmt.blockAlign == 0) {
3022 translatedFormatTag =
fmt.formatTag;
3027 memset(&metadataParser, 0,
sizeof(metadataParser));
3033 metadataParser.onRead = pWav->
onRead;
3034 metadataParser.onSeek = pWav->
onSeek;
3035 metadataParser.pReadSeekUserData = pWav->
pUserData;
3036 metadataParser.stage = drwav__metadata_parser_stage_count;
3049 bytesRead = drwav__metadata_process_chunk(&metadataParser, &header, pWav->
allowedMetadataTypes);
3053 if (!drwav__seek_forward(pWav->
onSeek, remainingBytes, pWav->
pUserData)) {
3056 cursorForMetadata += remainingBytes;
3064 metadataParser.stage = drwav__metadata_parser_stage_read;
3081 if (!foundDataChunk) {
3089 if (!sequential && onChunk !=
NULL) {
3096 if (callbackBytesRead > 0) {
3106 if (bytesRead > 0) {
3114 if (!foundDataChunk) {
3123 dataChunkSize = chunkSize;
3129 dataChunkSize = chunkSize;
3137 if (foundDataChunk && sequential) {
3145 if (drwav__on_read(pWav->
onRead, pWav->
pUserData, &sampleCount, 4, &cursor) != 4) {
3150 if (!foundDataChunk) {
3159 sampleCountFromFactChunk = sampleCount;
3161 sampleCountFromFactChunk = 0;
3166 if (drwav__on_read(pWav->
onRead, pWav->
pUserData, &sampleCountFromFactChunk, 8, &cursor) != 8) {
3171 if (!foundDataChunk) {
3184 cursor += chunkSize;
3186 if (!foundDataChunk) {
3191 pWav->
pMetadata = metadataParser.pMetadata;
3195 if (!foundDataChunk) {
3218 if (sampleCountFromFactChunk != 0) {
3228 if ((blockCount *
fmt.blockAlign) < dataChunkSize) {
3233 totalBlockHeaderSizeInBytes = blockCount * (6*
fmt.channels);
3241 if ((blockCount *
fmt.blockAlign) < dataChunkSize) {
3246 totalBlockHeaderSizeInBytes = blockCount * (4*
fmt.channels);
3262 if (drwav_get_bytes_per_pcm_frame(pWav) == 0) {
3266#ifdef DR_WAV_LIBSNDFILE_COMPAT
3295 if (!drwav_preinit(pWav, onRead, onSeek, pReadSeekUserData, pAllocationCallbacks)) {
3299 return drwav_init__internal(pWav, onChunk, pChunkUserData, flags);
3304 if (!drwav_preinit(pWav, onRead, onSeek, pUserData, pAllocationCallbacks)) {
3309 return drwav_init__internal(pWav,
NULL,
NULL, flags);
3325 DRWAV_ASSERT(pWav !=
NULL);
3334 DRWAV_ASSERT(pWav !=
NULL);
3342 DRWAV_ASSERT(pWav !=
NULL);
3345 if (!drwav__is_little_endian()) {
3349 return drwav__write(pWav, &
value, 2);
3354 DRWAV_ASSERT(pWav !=
NULL);
3357 if (!drwav__is_little_endian()) {
3361 return drwav__write(pWav, &
value, 4);
3366 DRWAV_ASSERT(pWav !=
NULL);
3369 if (!drwav__is_little_endian()) {
3373 return drwav__write(pWav, &
value, 8);
3383 DRWAV_ASSERT(pWav !=
NULL);
3388 if (!drwav__is_little_endian()) {
3389 u.u32 = drwav__bswap32(
u.u32);
3392 return drwav__write(pWav, &
u.u32, 4);
3395DRWAV_PRIVATE size_t drwav__write_or_count(
drwav* pWav,
const void* pData,
size_t dataSize)
3401 return drwav__write(pWav, pData, dataSize);
3410 return drwav__write_byte(pWav,
byte);
3419 return drwav__write_u16ne_to_le(pWav,
value);
3428 return drwav__write_u32ne_to_le(pWav,
value);
3438 return drwav__write_u64ne_to_le(pWav,
value);
3448 return drwav__write_f32ne_to_le(pWav,
value);
3451DRWAV_PRIVATE size_t drwav__write_or_count_string_to_fixed_size_buf(
drwav* pWav,
char* str,
size_t bufFixedSize)
3456 return bufFixedSize;
3459 len = drwav__strlen_clamped(str, bufFixedSize);
3460 drwav__write_or_count(pWav, str, len);
3462 if (len < bufFixedSize) {
3464 for (
i = 0;
i < bufFixedSize - len; ++
i) {
3465 drwav__write_byte(pWav, 0);
3469 return bufFixedSize;
3476 size_t bytesWritten = 0;
3481 if (pMetadatas ==
NULL || metadataCount == 0) {
3485 for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) {
3497 switch (pMetadata->
type) {
3504 bytesWritten += drwav__write_or_count(pWav,
"smpl", 4);
3505 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize);
3508 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->
data.
smpl.
productId);
3512 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->
data.
smpl.
smpteFormat);
3513 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->
data.
smpl.
smpteOffset);
3519 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->
data.
smpl.
pLoops[iLoop].
type);
3533 chunkSize = DRWAV_INST_BYTES;
3535 bytesWritten += drwav__write_or_count(pWav,
"inst", 4);
3536 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize);
3540 bytesWritten += drwav__write_or_count(pWav, &pMetadata->
data.
inst.
lowNote, 1);
3541 bytesWritten += drwav__write_or_count(pWav, &pMetadata->
data.
inst.
highNote, 1);
3552 bytesWritten += drwav__write_or_count(pWav,
"cue ", 4);
3553 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize);
3556 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->
data.
cue.
pCuePoints[iCuePoint].
id);
3567 chunkSize = DRWAV_ACID_BYTES;
3569 bytesWritten += drwav__write_or_count(pWav,
"acid", 4);
3570 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize);
3571 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->
data.
acid.
flags);
3573 bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->
data.
acid.
reserved1);
3574 bytesWritten += drwav__write_or_count_f32ne_to_le(pWav, pMetadata->
data.
acid.
reserved2);
3575 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->
data.
acid.
numBeats);
3578 bytesWritten += drwav__write_or_count_f32ne_to_le(pWav, pMetadata->
data.
acid.
tempo);
3583 char reservedBuf[DRWAV_BEXT_RESERVED_BYTES];
3589 bytesWritten += drwav__write_or_count(pWav,
"bext", 4);
3590 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize);
3592 bytesWritten += drwav__write_or_count_string_to_fixed_size_buf(pWav, pMetadata->
data.
bext.
pDescription, DRWAV_BEXT_DESCRIPTION_BYTES);
3593 bytesWritten += drwav__write_or_count_string_to_fixed_size_buf(pWav, pMetadata->
data.
bext.
pOriginatorName, DRWAV_BEXT_ORIGINATOR_NAME_BYTES);
3594 bytesWritten += drwav__write_or_count_string_to_fixed_size_buf(pWav, pMetadata->
data.
bext.
pOriginatorReference, DRWAV_BEXT_ORIGINATOR_REF_BYTES);
3600 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, timeReferenceLow);
3601 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, timeReferenceHigh);
3603 bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->
data.
bext.
version);
3604 bytesWritten += drwav__write_or_count(pWav, pMetadata->
data.
bext.
pUMID, DRWAV_BEXT_UMID_BYTES);
3611 memset(reservedBuf, 0,
sizeof(reservedBuf));
3612 bytesWritten += drwav__write_or_count(pWav, reservedBuf,
sizeof(reservedBuf));
3624 bytesWritten += drwav__write_or_count(pWav, pMetadata->
data.
unknown.
id, 4);
3625 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize);
3632 if ((chunkSize % 2) != 0) {
3633 bytesWritten += drwav__write_or_count_byte(pWav, 0);
3639 for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) {
3650 if ((chunkSize % 2) != 0) {
3655 bytesWritten += drwav__write_or_count(pWav,
"LIST", 4);
3656 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize);
3657 bytesWritten += drwav__write_or_count(pWav,
"INFO", 4);
3659 for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) {
3664 const char* pID =
NULL;
3666 switch (pMetadata->
type) {
3679 DRWAV_ASSERT(pID !=
NULL);
3683 bytesWritten += drwav__write_or_count(pWav, pID, 4);
3684 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, subchunkSize);
3686 bytesWritten += drwav__write_or_count_byte(pWav,
'\0');
3692 bytesWritten += drwav__write_or_count(pWav, pMetadata->
data.
unknown.
id, 4);
3694 bytesWritten += drwav__write_or_count(pWav, pMetadata->
data.
unknown.
pData, subchunkSize);
3698 if ((subchunkSize % 2) != 0) {
3699 bytesWritten += drwav__write_or_count_byte(pWav, 0);
3707 for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) {
3710 switch (pMetadata->
type)
3716 chunkSize += DRWAV_LIST_LABEL_OR_NOTE_BYTES;
3726 chunkSize += DRWAV_LIST_LABELLED_TEXT_BYTES;
3744 if ((chunkSize % 2) != 0) {
3749 bytesWritten += drwav__write_or_count(pWav,
"LIST", 4);
3750 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize);
3751 bytesWritten += drwav__write_or_count(pWav,
"adtl", 4);
3753 for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) {
3757 switch (pMetadata->
type)
3763 const char *pID =
NULL;
3772 DRWAV_ASSERT(pID !=
NULL);
3775 subchunkSize = DRWAV_LIST_LABEL_OR_NOTE_BYTES;
3777 bytesWritten += drwav__write_or_count(pWav, pID, 4);
3779 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, subchunkSize);
3783 bytesWritten += drwav__write_or_count_byte(pWav,
'\0');
3789 subchunkSize = DRWAV_LIST_LABELLED_TEXT_BYTES;
3791 bytesWritten += drwav__write_or_count(pWav,
"ltxt", 4);
3795 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, subchunkSize);
3808 bytesWritten += drwav__write_or_count_byte(pWav,
'\0');
3818 bytesWritten += drwav__write_or_count(pWav, pMetadata->
data.
unknown.
id, 4);
3819 bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, subchunkSize);
3820 bytesWritten += drwav__write_or_count(pWav, pMetadata->
data.
unknown.
pData, subchunkSize);
3827 if ((subchunkSize % 2) != 0) {
3828 bytesWritten += drwav__write_or_count_byte(pWav, 0);
3833 DRWAV_ASSERT((bytesWritten % 2) == 0);
3835 return bytesWritten;
3840 drwav_uint64 chunkSize = 4 + 24 + (
drwav_uint64)drwav__write_or_count_metadata(
NULL, pMetadata, metadataCount) + 8 + dataChunkSize + drwav__chunk_padding_size_riff(dataChunkSize);
3841 if (chunkSize > 0xFFFFFFFFUL) {
3842 chunkSize = 0xFFFFFFFFUL;
3850 if (dataChunkSize <= 0xFFFFFFFFUL) {
3853 return 0xFFFFFFFFUL;
3859 drwav_uint64 dataSubchunkPaddingSize = drwav__chunk_padding_size_w64(dataChunkSize);
3861 return 80 + 24 + dataChunkSize + dataSubchunkPaddingSize;
3866 return 24 + dataChunkSize;
3871 drwav_uint64 chunkSize = 4 + 36 + 24 + (
drwav_uint64)drwav__write_or_count_metadata(
NULL, metadata, numMetadata) + 8 + dataChunkSize + drwav__chunk_padding_size_riff(dataChunkSize);
3872 if (chunkSize > 0xFFFFFFFFUL) {
3873 chunkSize = 0xFFFFFFFFUL;
3881 return dataChunkSize;
3888 if (pWav ==
NULL || onWrite ==
NULL) {
3892 if (!isSequential && onSeek ==
NULL) {
3904 DRWAV_ZERO_MEMORY(pWav,
sizeof(*pWav));
3908 pWav->
allocationCallbacks = drwav_copy_allocation_callbacks_or_defaults(pAllocationCallbacks);
3931 size_t runningPos = 0;
3948 if (initialDataChunkSize > (0xFFFFFFFFUL - 36)) {
3960 runningPos += drwav__write(pWav,
"RIFF", 4);
3961 runningPos += drwav__write_u32ne_to_le(pWav, chunkSizeRIFF);
3962 runningPos += drwav__write(pWav,
"WAVE", 4);
3964 drwav_uint64 chunkSizeRIFF = 80 + 24 + initialDataChunkSize;
3965 runningPos += drwav__write(pWav, drwavGUID_W64_RIFF, 16);
3966 runningPos += drwav__write_u64ne_to_le(pWav, chunkSizeRIFF);
3967 runningPos += drwav__write(pWav, drwavGUID_W64_WAVE, 16);
3969 runningPos += drwav__write(pWav,
"RF64", 4);
3970 runningPos += drwav__write_u32ne_to_le(pWav, 0xFFFFFFFF);
3971 runningPos += drwav__write(pWav,
"WAVE", 4);
3978 drwav_uint64 initialRiffChunkSize = 8 + initialds64ChunkSize + initialDataChunkSize;
3980 runningPos += drwav__write(pWav,
"ds64", 4);
3981 runningPos += drwav__write_u32ne_to_le(pWav, initialds64ChunkSize);
3982 runningPos += drwav__write_u64ne_to_le(pWav, initialRiffChunkSize);
3983 runningPos += drwav__write_u64ne_to_le(pWav, initialDataChunkSize);
3984 runningPos += drwav__write_u64ne_to_le(pWav, totalSampleCount);
3985 runningPos += drwav__write_u32ne_to_le(pWav, 0);
3992 runningPos += drwav__write(pWav,
"fmt ", 4);
3993 runningPos += drwav__write_u32ne_to_le(pWav, (
drwav_uint32)chunkSizeFMT);
3996 runningPos += drwav__write(pWav, drwavGUID_W64_FMT, 16);
3997 runningPos += drwav__write_u64ne_to_le(pWav, chunkSizeFMT);
4000 runningPos += drwav__write_u16ne_to_le(pWav, pWav->
fmt.
formatTag);
4001 runningPos += drwav__write_u16ne_to_le(pWav, pWav->
fmt.
channels);
4002 runningPos += drwav__write_u32ne_to_le(pWav, pWav->
fmt.
sampleRate);
4004 runningPos += drwav__write_u16ne_to_le(pWav, pWav->
fmt.
blockAlign);
4018 runningPos += drwav__write(pWav,
"data", 4);
4019 runningPos += drwav__write_u32ne_to_le(pWav, chunkSizeDATA);
4021 drwav_uint64 chunkSizeDATA = 24 + initialDataChunkSize;
4022 runningPos += drwav__write(pWav, drwavGUID_W64_DATA, 16);
4023 runningPos += drwav__write_u64ne_to_le(pWav, chunkSizeDATA);
4025 runningPos += drwav__write(pWav,
"data", 4);
4026 runningPos += drwav__write_u32ne_to_le(pWav, 0xFFFFFFFF);
4043 if (!drwav_preinit_write(pWav, pFormat,
DRWAV_FALSE, onWrite, onSeek, pUserData, pAllocationCallbacks)) {
4047 return drwav_init_write__internal(pWav, pFormat, 0);
4052 if (!drwav_preinit_write(pWav, pFormat,
DRWAV_TRUE, onWrite,
NULL, pUserData, pAllocationCallbacks)) {
4056 return drwav_init_write__internal(pWav, pFormat, totalSampleCount);
4061 if (pFormat ==
NULL) {
4070 if (!drwav_preinit_write(pWav, pFormat,
DRWAV_FALSE, onWrite, onSeek, pUserData, pAllocationCallbacks)) {
4077 return drwav_init_write__internal(pWav, pFormat, 0);
4089 riffChunkSizeBytes = drwav__riff_chunk_size_riff(targetDataSizeBytes, pMetadata, metadataCount);
4090 fileSizeBytes = (8 + riffChunkSizeBytes);
4092 riffChunkSizeBytes = drwav__riff_chunk_size_w64(targetDataSizeBytes);
4093 fileSizeBytes = riffChunkSizeBytes;
4095 riffChunkSizeBytes = drwav__riff_chunk_size_rf64(targetDataSizeBytes, pMetadata, metadataCount);
4096 fileSizeBytes = (8 + riffChunkSizeBytes);
4099 return fileSizeBytes;
4103#ifndef DR_WAV_NO_STDIO
4382 #ifdef EPROTONOSUPPORT
4385 #ifdef ESOCKTNOSUPPORT
4400 #ifdef EADDRNOTAVAIL
4496 #ifdef ENOTRECOVERABLE
4511#if defined(_MSC_VER) && _MSC_VER >= 1400
4515 if (ppFile !=
NULL) {
4519 if (pFilePath ==
NULL || pOpenMode ==
NULL || ppFile ==
NULL) {
4523#if defined(_MSC_VER) && _MSC_VER >= 1400
4524 err = fopen_s(ppFile, pFilePath, pOpenMode);
4526 return drwav_result_from_errno(err);
4529#if defined(_WIN32) || defined(__APPLE__)
4530 *ppFile = fopen(pFilePath, pOpenMode);
4532 #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(_LARGEFILE64_SOURCE)
4533 *ppFile = fopen64(pFilePath, pOpenMode);
4535 *ppFile = fopen(pFilePath, pOpenMode);
4538 if (*ppFile ==
NULL) {
4564 #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS))
4565 #define DRWAV_HAS_WFOPEN
4571 if (ppFile !=
NULL) {
4575 if (pFilePath ==
NULL || pOpenMode ==
NULL || ppFile ==
NULL) {
4579#if defined(DRWAV_HAS_WFOPEN)
4582 #if defined(_MSC_VER) && _MSC_VER >= 1400
4583 errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode);
4585 return drwav_result_from_errno(err);
4588 *ppFile = _wfopen(pFilePath, pOpenMode);
4589 if (*ppFile ==
NULL) {
4590 return drwav_result_from_errno(errno);
4593 (
void)pAllocationCallbacks;
4604 const wchar_t* pFilePathTemp = pFilePath;
4605 char* pFilePathMB =
NULL;
4606 char pOpenModeMB[32] = {0};
4609 DRWAV_ZERO_OBJECT(&mbs);
4610 lenMB = wcsrtombs(
NULL, &pFilePathTemp, 0, &mbs);
4611 if (lenMB == (
size_t)-1) {
4612 return drwav_result_from_errno(errno);
4615 pFilePathMB = (
char*)drwav__malloc_from_callbacks(lenMB + 1, pAllocationCallbacks);
4616 if (pFilePathMB ==
NULL) {
4620 pFilePathTemp = pFilePath;
4621 DRWAV_ZERO_OBJECT(&mbs);
4622 wcsrtombs(pFilePathMB, &pFilePathTemp, lenMB + 1, &mbs);
4628 if (pOpenMode[
i] == 0) {
4629 pOpenModeMB[
i] =
'\0';
4633 pOpenModeMB[
i] = (char)pOpenMode[
i];
4638 *ppFile = fopen(pFilePathMB, pOpenModeMB);
4640 drwav__free_from_callbacks(pFilePathMB, pAllocationCallbacks);
4643 if (*ppFile ==
NULL) {
4652DRWAV_PRIVATE size_t drwav__on_read_stdio(
void* pUserData,
void* pBufferOut,
size_t bytesToRead)
4654 return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData);
4657DRWAV_PRIVATE size_t drwav__on_write_stdio(
void* pUserData,
const void* pData,
size_t bytesToWrite)
4659 return fwrite(pData, 1, bytesToWrite, (FILE*)pUserData);
4677 result = drwav_preinit(pWav, drwav__on_read_stdio, drwav__on_seek_stdio, (
void*)pFile, pAllocationCallbacks);
4685 result = drwav_init__internal(pWav, onChunk, pChunkUserData, flags);
4702 return drwav_init_file__internal_FILE(pWav, pFile, onChunk, pChunkUserData, flags,
drwav_metadata_type_none, pAllocationCallbacks);
4718 return drwav_init_file__internal_FILE(pWav, pFile, onChunk, pChunkUserData, flags,
drwav_metadata_type_none, pAllocationCallbacks);
4748 result = drwav_preinit_write(pWav, pFormat, isSequential, drwav__on_write_stdio, drwav__on_seek_stdio, (
void*)pFile, pAllocationCallbacks);
4754 result = drwav_init_write__internal(pWav, pFormat, totalSampleCount);
4771 return drwav_init_file_write__internal_FILE(pWav, pFile, pFormat, totalSampleCount, isSequential, pAllocationCallbacks);
4782 return drwav_init_file_write__internal_FILE(pWav, pFile, pFormat, totalSampleCount, isSequential, pAllocationCallbacks);
4787 return drwav_init_file_write__internal(pWav,
filename, pFormat, 0,
DRWAV_FALSE, pAllocationCallbacks);
4792 return drwav_init_file_write__internal(pWav,
filename, pFormat, totalSampleCount,
DRWAV_TRUE, pAllocationCallbacks);
4797 if (pFormat ==
NULL) {
4806 return drwav_init_file_write_w__internal(pWav,
filename, pFormat, 0,
DRWAV_FALSE, pAllocationCallbacks);
4811 return drwav_init_file_write_w__internal(pWav,
filename, pFormat, totalSampleCount,
DRWAV_TRUE, pAllocationCallbacks);
4816 if (pFormat ==
NULL) {
4825DRWAV_PRIVATE size_t drwav__on_read_memory(
void* pUserData,
void* pBufferOut,
size_t bytesToRead)
4828 size_t bytesRemaining;
4830 DRWAV_ASSERT(pWav !=
NULL);
4834 if (bytesToRead > bytesRemaining) {
4835 bytesToRead = bytesRemaining;
4838 if (bytesToRead > 0) {
4849 DRWAV_ASSERT(pWav !=
NULL);
4865 if ((
drwav_uint32)offset <= pWav->memoryStream.dataSize) {
4875DRWAV_PRIVATE size_t drwav__on_write_memory(
void* pUserData,
const void* pDataIn,
size_t bytesToWrite)
4878 size_t bytesRemaining;
4880 DRWAV_ASSERT(pWav !=
NULL);
4884 if (bytesRemaining < bytesToWrite) {
4895 if (pNewData ==
NULL) {
4912 return bytesToWrite;
4918 DRWAV_ASSERT(pWav !=
NULL);
4934 if ((
drwav_uint32)offset <= pWav->memoryStreamWrite.dataSize) {
4951 if (
data ==
NULL || dataSize == 0) {
4955 if (!drwav_preinit(pWav, drwav__on_read_memory, drwav__on_seek_memory, pWav, pAllocationCallbacks)) {
4963 return drwav_init__internal(pWav, onChunk, pChunkUserData, flags);
4968 if (
data ==
NULL || dataSize == 0) {
4972 if (!drwav_preinit(pWav, drwav__on_read_memory, drwav__on_seek_memory, pWav, pAllocationCallbacks)) {
4982 return drwav_init__internal(pWav,
NULL,
NULL, flags);
4988 if (ppData ==
NULL || pDataSize ==
NULL) {
4995 if (!drwav_preinit_write(pWav, pFormat, isSequential, drwav__on_write_memory, drwav__on_seek_memory_write, pWav, pAllocationCallbacks)) {
5005 return drwav_init_write__internal(pWav, pFormat, totalSampleCount);
5010 return drwav_init_memory_write__internal(pWav, ppData, pDataSize, pFormat, 0,
DRWAV_FALSE, pAllocationCallbacks);
5015 return drwav_init_memory_write__internal(pWav, ppData, pDataSize, pFormat, totalSampleCount,
DRWAV_TRUE, pAllocationCallbacks);
5020 if (pFormat ==
NULL) {
5052 if (paddingSize > 0) {
5054 drwav__write(pWav, &paddingData, paddingSize);
5066 drwav__write_u32ne_to_le(pWav, riffChunkSize);
5072 drwav__write_u32ne_to_le(pWav, dataChunkSize);
5078 drwav__write_u64ne_to_le(pWav, riffChunkSize);
5084 drwav__write_u64ne_to_le(pWav, dataChunkSize);
5088 int ds64BodyPos = 12 + 8;
5093 drwav__write_u64ne_to_le(pWav, riffChunkSize);
5099 drwav__write_u64ne_to_le(pWav, dataChunkSize);
5116#ifndef DR_WAV_NO_STDIO
5121 if (pWav->
onRead == drwav__on_read_stdio || pWav->
onWrite == drwav__on_write_stdio) {
5135 if (pWav ==
NULL || bytesToRead == 0) {
5143 if (bytesToRead == 0) {
5147 if (pBufferOut !=
NULL) {
5152 while (bytesRead < bytesToRead) {
5153 size_t bytesToSeek = (bytesToRead - bytesRead);
5154 if (bytesToSeek > 0x7FFFFFFF) {
5155 bytesToSeek = 0x7FFFFFFF;
5162 bytesRead += bytesToSeek;
5166 while (bytesRead < bytesToRead) {
5169 size_t bytesToSeek = (bytesToRead - bytesRead);
5170 if (bytesToSeek >
sizeof(buffer)) {
5171 bytesToSeek =
sizeof(
buffer);
5175 bytesRead += bytesSeeked;
5177 if (bytesSeeked < bytesToSeek) {
5196 if (pWav ==
NULL || framesToRead == 0) {
5205 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
5206 if (bytesPerFrame == 0) {
5211 bytesToRead = framesToRead * bytesPerFrame;
5212 if (bytesToRead > DRWAV_SIZE_MAX) {
5213 bytesToRead = (DRWAV_SIZE_MAX / bytesPerFrame) * bytesPerFrame;
5220 if (bytesToRead == 0) {
5224 return drwav_read_raw(pWav, (
size_t)bytesToRead, pBufferOut) / bytesPerFrame;
5231 if (pBufferOut !=
NULL) {
5240 if (drwav__is_little_endian()) {
5262 DRWAV_ZERO_OBJECT(&pWav->
msadpcm);
5264 DRWAV_ZERO_OBJECT(&pWav->
ima);
5310 if (targetFrameIndex < pWav->readCursorInPCMFrames) {
5311 if (!drwav_seek_to_first_pcm_frame(pWav)) {
5320 while (offsetInFrames > 0) {
5323 if (framesToRead > drwav_countof(devnull)/pWav->
channels) {
5324 framesToRead = drwav_countof(devnull)/pWav->
channels;
5328 framesRead = drwav_read_pcm_frames_s16__msadpcm(pWav, framesToRead, devnull);
5330 framesRead = drwav_read_pcm_frames_s16__ima(pWav, framesToRead, devnull);
5335 if (framesRead != framesToRead) {
5339 offsetInFrames -= framesRead;
5352 targetBytePos = targetFrameIndex * drwav_get_bytes_per_pcm_frame(pWav);
5354 if (currentBytePos < targetBytePos) {
5356 offset = (targetBytePos - currentBytePos);
5359 if (!drwav_seek_to_first_pcm_frame(pWav)) {
5362 offset = targetBytePos;
5365 while (offset > 0) {
5366 int offset32 = ((offset > INT_MAX) ? INT_MAX : (
int)offset);
5382 if (pCursor ==
NULL) {
5399 if (pLength ==
NULL) {
5417 size_t bytesWritten;
5419 if (pWav ==
NULL || bytesToWrite == 0 || pData ==
NULL) {
5426 return bytesWritten;
5435 if (pWav ==
NULL || framesToWrite == 0 || pData ==
NULL) {
5440 if (bytesToWrite > DRWAV_SIZE_MAX) {
5447 while (bytesToWrite > 0) {
5448 size_t bytesJustWritten;
5451 bytesToWriteThisIteration = bytesToWrite;
5452 DRWAV_ASSERT(bytesToWriteThisIteration <= DRWAV_SIZE_MAX);
5454 bytesJustWritten =
drwav_write_raw(pWav, (
size_t)bytesToWriteThisIteration, pRunningData);
5455 if (bytesJustWritten == 0) {
5459 bytesToWrite -= bytesJustWritten;
5460 bytesWritten += bytesJustWritten;
5461 pRunningData += bytesJustWritten;
5474 if (pWav ==
NULL || framesToWrite == 0 || pData ==
NULL) {
5479 if (bytesToWrite > DRWAV_SIZE_MAX) {
5486 bytesPerSample = drwav_get_bytes_per_pcm_frame(pWav) / pWav->
channels;
5488 while (bytesToWrite > 0) {
5491 size_t bytesJustWritten;
5494 bytesToWriteThisIteration = bytesToWrite;
5495 DRWAV_ASSERT(bytesToWriteThisIteration <= DRWAV_SIZE_MAX);
5501 sampleCount =
sizeof(temp)/bytesPerSample;
5503 if (bytesToWriteThisIteration > ((
drwav_uint64)sampleCount)*bytesPerSample) {
5504 bytesToWriteThisIteration = ((
drwav_uint64)sampleCount)*bytesPerSample;
5507 DRWAV_COPY_MEMORY(temp, pRunningData, (
size_t)bytesToWriteThisIteration);
5510 bytesJustWritten =
drwav_write_raw(pWav, (
size_t)bytesToWriteThisIteration, temp);
5511 if (bytesJustWritten == 0) {
5515 bytesToWrite -= bytesJustWritten;
5516 bytesWritten += bytesJustWritten;
5517 pRunningData += bytesJustWritten;
5525 if (drwav__is_little_endian()) {
5537 DRWAV_ASSERT(pWav !=
NULL);
5538 DRWAV_ASSERT(framesToRead > 0);
5543 DRWAV_ASSERT(framesToRead > 0);
5550 if (pWav->
onRead(pWav->
pUserData, header,
sizeof(header)) !=
sizeof(header)) {
5551 return totalFramesRead;
5565 if (pWav->
onRead(pWav->
pUserData, header,
sizeof(header)) !=
sizeof(header)) {
5566 return totalFramesRead;
5589 if (pBufferOut !=
NULL) {
5591 for (iSample = 0; iSample < pWav->
channels; iSample += 1) {
5599 totalFramesRead += 1;
5604 if (framesToRead == 0) {
5618 230, 230, 230, 230, 307, 409, 512, 614,
5619 768, 614, 512, 409, 307, 230, 230, 230
5621 static drwav_int32 coeff1Table[] = { 256, 512, 0, 192, 240, 460, 392 };
5622 static drwav_int32 coeff2Table[] = { 0, -256, 0, 64, 0, -208, -232 };
5629 return totalFramesRead;
5634 nibble0 = ((nibbles & 0xF0) >> 4);
if ((nibbles & 0x80)) { nibble0 |= 0xFFFFFFF0UL; }
5635 nibble1 = ((nibbles & 0x0F) >> 0);
if ((nibbles & 0x08)) { nibble1 |= 0xFFFFFFF0UL; }
5644 newSample0 = drwav_clamp(newSample0, -32768, 32767);
5657 newSample1 = drwav_clamp(newSample1, -32768, 32767);
5679 newSample0 = drwav_clamp(newSample0, -32768, 32767);
5693 newSample1 = drwav_clamp(newSample1, -32768, 32767);
5711 return totalFramesRead;
5721 -1, -1, -1, -1, 2, 4, 6, 8,
5722 -1, -1, -1, -1, 2, 4, 6, 8
5726 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
5727 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
5728 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
5729 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
5730 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
5731 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
5732 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
5733 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
5734 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
5737 DRWAV_ASSERT(pWav !=
NULL);
5738 DRWAV_ASSERT(framesToRead > 0);
5743 DRWAV_ASSERT(framesToRead > 0);
5750 if (pWav->
onRead(pWav->
pUserData, header,
sizeof(header)) !=
sizeof(header)) {
5751 return totalFramesRead;
5755 if (header[2] >= drwav_countof(stepTable)) {
5758 return totalFramesRead;
5768 if (pWav->
onRead(pWav->
pUserData, header,
sizeof(header)) !=
sizeof(header)) {
5769 return totalFramesRead;
5773 if (header[2] >= drwav_countof(stepTable) || header[6] >= drwav_countof(stepTable)) {
5776 return totalFramesRead;
5792 if (pBufferOut !=
NULL) {
5794 for (iSample = 0; iSample < pWav->
channels; iSample += 1) {
5801 totalFramesRead += 1;
5806 if (framesToRead == 0) {
5823 for (iChannel = 0; iChannel < pWav->
channels; ++iChannel) {
5828 return totalFramesRead;
5832 for (iByte = 0; iByte < 4; ++iByte) {
5833 drwav_uint8 nibble0 = ((nibbles[iByte] & 0x0F) >> 0);
5834 drwav_uint8 nibble1 = ((nibbles[iByte] & 0xF0) >> 4);
5840 if (nibble0 & 1)
diff += step >> 2;
5841 if (nibble0 & 2)
diff += step >> 1;
5842 if (nibble0 & 4)
diff += step;
5845 predictor = drwav_clamp(predictor +
diff, -32768, 32767);
5855 if (nibble1 & 1)
diff += step >> 2;
5856 if (nibble1 & 2)
diff += step >> 1;
5857 if (nibble1 & 4)
diff += step;
5860 predictor = drwav_clamp(predictor +
diff, -32768, 32767);
5870 return totalFramesRead;
5874#ifndef DR_WAV_NO_CONVERSION_API
5875static unsigned short g_drwavAlawTable[256] = {
5876 0xEA80, 0xEB80, 0xE880, 0xE980, 0xEE80, 0xEF80, 0xEC80, 0xED80, 0xE280, 0xE380, 0xE080, 0xE180, 0xE680, 0xE780, 0xE480, 0xE580,
5877 0xF540, 0xF5C0, 0xF440, 0xF4C0, 0xF740, 0xF7C0, 0xF640, 0xF6C0, 0xF140, 0xF1C0, 0xF040, 0xF0C0, 0xF340, 0xF3C0, 0xF240, 0xF2C0,
5878 0xAA00, 0xAE00, 0xA200, 0xA600, 0xBA00, 0xBE00, 0xB200, 0xB600, 0x8A00, 0x8E00, 0x8200, 0x8600, 0x9A00, 0x9E00, 0x9200, 0x9600,
5879 0xD500, 0xD700, 0xD100, 0xD300, 0xDD00, 0xDF00, 0xD900, 0xDB00, 0xC500, 0xC700, 0xC100, 0xC300, 0xCD00, 0xCF00, 0xC900, 0xCB00,
5880 0xFEA8, 0xFEB8, 0xFE88, 0xFE98, 0xFEE8, 0xFEF8, 0xFEC8, 0xFED8, 0xFE28, 0xFE38, 0xFE08, 0xFE18, 0xFE68, 0xFE78, 0xFE48, 0xFE58,
5881 0xFFA8, 0xFFB8, 0xFF88, 0xFF98, 0xFFE8, 0xFFF8, 0xFFC8, 0xFFD8, 0xFF28, 0xFF38, 0xFF08, 0xFF18, 0xFF68, 0xFF78, 0xFF48, 0xFF58,
5882 0xFAA0, 0xFAE0, 0xFA20, 0xFA60, 0xFBA0, 0xFBE0, 0xFB20, 0xFB60, 0xF8A0, 0xF8E0, 0xF820, 0xF860, 0xF9A0, 0xF9E0, 0xF920, 0xF960,
5883 0xFD50, 0xFD70, 0xFD10, 0xFD30, 0xFDD0, 0xFDF0, 0xFD90, 0xFDB0, 0xFC50, 0xFC70, 0xFC10, 0xFC30, 0xFCD0, 0xFCF0, 0xFC90, 0xFCB0,
5884 0x1580, 0x1480, 0x1780, 0x1680, 0x1180, 0x1080, 0x1380, 0x1280, 0x1D80, 0x1C80, 0x1F80, 0x1E80, 0x1980, 0x1880, 0x1B80, 0x1A80,
5885 0x0AC0, 0x0A40, 0x0BC0, 0x0B40, 0x08C0, 0x0840, 0x09C0, 0x0940, 0x0EC0, 0x0E40, 0x0FC0, 0x0F40, 0x0CC0, 0x0C40, 0x0DC0, 0x0D40,
5886 0x5600, 0x5200, 0x5E00, 0x5A00, 0x4600, 0x4200, 0x4E00, 0x4A00, 0x7600, 0x7200, 0x7E00, 0x7A00, 0x6600, 0x6200, 0x6E00, 0x6A00,
5887 0x2B00, 0x2900, 0x2F00, 0x2D00, 0x2300, 0x2100, 0x2700, 0x2500, 0x3B00, 0x3900, 0x3F00, 0x3D00, 0x3300, 0x3100, 0x3700, 0x3500,
5888 0x0158, 0x0148, 0x0178, 0x0168, 0x0118, 0x0108, 0x0138, 0x0128, 0x01D8, 0x01C8, 0x01F8, 0x01E8, 0x0198, 0x0188, 0x01B8, 0x01A8,
5889 0x0058, 0x0048, 0x0078, 0x0068, 0x0018, 0x0008, 0x0038, 0x0028, 0x00D8, 0x00C8, 0x00F8, 0x00E8, 0x0098, 0x0088, 0x00B8, 0x00A8,
5890 0x0560, 0x0520, 0x05E0, 0x05A0, 0x0460, 0x0420, 0x04E0, 0x04A0, 0x0760, 0x0720, 0x07E0, 0x07A0, 0x0660, 0x0620, 0x06E0, 0x06A0,
5891 0x02B0, 0x0290, 0x02F0, 0x02D0, 0x0230, 0x0210, 0x0270, 0x0250, 0x03B0, 0x0390, 0x03F0, 0x03D0, 0x0330, 0x0310, 0x0370, 0x0350
5894static unsigned short g_drwavMulawTable[256] = {
5895 0x8284, 0x8684, 0x8A84, 0x8E84, 0x9284, 0x9684, 0x9A84, 0x9E84, 0xA284, 0xA684, 0xAA84, 0xAE84, 0xB284, 0xB684, 0xBA84, 0xBE84,
5896 0xC184, 0xC384, 0xC584, 0xC784, 0xC984, 0xCB84, 0xCD84, 0xCF84, 0xD184, 0xD384, 0xD584, 0xD784, 0xD984, 0xDB84, 0xDD84, 0xDF84,
5897 0xE104, 0xE204, 0xE304, 0xE404, 0xE504, 0xE604, 0xE704, 0xE804, 0xE904, 0xEA04, 0xEB04, 0xEC04, 0xED04, 0xEE04, 0xEF04, 0xF004,
5898 0xF0C4, 0xF144, 0xF1C4, 0xF244, 0xF2C4, 0xF344, 0xF3C4, 0xF444, 0xF4C4, 0xF544, 0xF5C4, 0xF644, 0xF6C4, 0xF744, 0xF7C4, 0xF844,
5899 0xF8A4, 0xF8E4, 0xF924, 0xF964, 0xF9A4, 0xF9E4, 0xFA24, 0xFA64, 0xFAA4, 0xFAE4, 0xFB24, 0xFB64, 0xFBA4, 0xFBE4, 0xFC24, 0xFC64,
5900 0xFC94, 0xFCB4, 0xFCD4, 0xFCF4, 0xFD14, 0xFD34, 0xFD54, 0xFD74, 0xFD94, 0xFDB4, 0xFDD4, 0xFDF4, 0xFE14, 0xFE34, 0xFE54, 0xFE74,
5901 0xFE8C, 0xFE9C, 0xFEAC, 0xFEBC, 0xFECC, 0xFEDC, 0xFEEC, 0xFEFC, 0xFF0C, 0xFF1C, 0xFF2C, 0xFF3C, 0xFF4C, 0xFF5C, 0xFF6C, 0xFF7C,
5902 0xFF88, 0xFF90, 0xFF98, 0xFFA0, 0xFFA8, 0xFFB0, 0xFFB8, 0xFFC0, 0xFFC8, 0xFFD0, 0xFFD8, 0xFFE0, 0xFFE8, 0xFFF0, 0xFFF8, 0x0000,
5903 0x7D7C, 0x797C, 0x757C, 0x717C, 0x6D7C, 0x697C, 0x657C, 0x617C, 0x5D7C, 0x597C, 0x557C, 0x517C, 0x4D7C, 0x497C, 0x457C, 0x417C,
5904 0x3E7C, 0x3C7C, 0x3A7C, 0x387C, 0x367C, 0x347C, 0x327C, 0x307C, 0x2E7C, 0x2C7C, 0x2A7C, 0x287C, 0x267C, 0x247C, 0x227C, 0x207C,
5905 0x1EFC, 0x1DFC, 0x1CFC, 0x1BFC, 0x1AFC, 0x19FC, 0x18FC, 0x17FC, 0x16FC, 0x15FC, 0x14FC, 0x13FC, 0x12FC, 0x11FC, 0x10FC, 0x0FFC,
5906 0x0F3C, 0x0EBC, 0x0E3C, 0x0DBC, 0x0D3C, 0x0CBC, 0x0C3C, 0x0BBC, 0x0B3C, 0x0ABC, 0x0A3C, 0x09BC, 0x093C, 0x08BC, 0x083C, 0x07BC,
5907 0x075C, 0x071C, 0x06DC, 0x069C, 0x065C, 0x061C, 0x05DC, 0x059C, 0x055C, 0x051C, 0x04DC, 0x049C, 0x045C, 0x041C, 0x03DC, 0x039C,
5908 0x036C, 0x034C, 0x032C, 0x030C, 0x02EC, 0x02CC, 0x02AC, 0x028C, 0x026C, 0x024C, 0x022C, 0x020C, 0x01EC, 0x01CC, 0x01AC, 0x018C,
5909 0x0174, 0x0164, 0x0154, 0x0144, 0x0134, 0x0124, 0x0114, 0x0104, 0x00F4, 0x00E4, 0x00D4, 0x00C4, 0x00B4, 0x00A4, 0x0094, 0x0084,
5910 0x0078, 0x0070, 0x0068, 0x0060, 0x0058, 0x0050, 0x0048, 0x0040, 0x0038, 0x0030, 0x0028, 0x0020, 0x0018, 0x0010, 0x0008, 0x0000
5915 return (
short)g_drwavAlawTable[sampleIn];
5920 return (
short)g_drwavMulawTable[sampleIn];
5930 if (bytesPerSample == 1) {
5937 if (bytesPerSample == 2) {
5938 for (
i = 0;
i < totalSampleCount; ++
i) {
5943 if (bytesPerSample == 3) {
5947 if (bytesPerSample == 4) {
5954 if (bytesPerSample > 8) {
5955 DRWAV_ZERO_MEMORY(pOut, totalSampleCount *
sizeof(*pOut));
5961 for (
i = 0;
i < totalSampleCount; ++
i) {
5963 unsigned int shift = (8 - bytesPerSample) * 8;
5966 for (
j = 0;
j < bytesPerSample;
j += 1) {
5967 DRWAV_ASSERT(
j < 8);
5979 if (bytesPerSample == 4) {
5982 }
else if (bytesPerSample == 8) {
5987 DRWAV_ZERO_MEMORY(pOut, totalSampleCount *
sizeof(*pOut));
6003 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6004 if (bytesPerFrame == 0) {
6008 totalFramesRead = 0;
6010 while (framesToRead > 0) {
6012 if (framesRead == 0) {
6016 drwav__pcm_to_s16(pBufferOut, sampleData, (
size_t)(framesRead*pWav->
channels), bytesPerFrame/pWav->
channels);
6018 pBufferOut += framesRead*pWav->
channels;
6019 framesToRead -= framesRead;
6020 totalFramesRead += framesRead;
6023 return totalFramesRead;
6032 if (pBufferOut ==
NULL) {
6036 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6037 if (bytesPerFrame == 0) {
6041 totalFramesRead = 0;
6043 while (framesToRead > 0) {
6045 if (framesRead == 0) {
6049 drwav__ieee_to_s16(pBufferOut, sampleData, (
size_t)(framesRead*pWav->
channels), bytesPerFrame/pWav->
channels);
6051 pBufferOut += framesRead*pWav->
channels;
6052 framesToRead -= framesRead;
6053 totalFramesRead += framesRead;
6056 return totalFramesRead;
6065 if (pBufferOut ==
NULL) {
6069 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6070 if (bytesPerFrame == 0) {
6074 totalFramesRead = 0;
6076 while (framesToRead > 0) {
6078 if (framesRead == 0) {
6084 pBufferOut += framesRead*pWav->
channels;
6085 framesToRead -= framesRead;
6086 totalFramesRead += framesRead;
6089 return totalFramesRead;
6098 if (pBufferOut ==
NULL) {
6102 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6103 if (bytesPerFrame == 0) {
6107 totalFramesRead = 0;
6109 while (framesToRead > 0) {
6111 if (framesRead == 0) {
6117 pBufferOut += framesRead*pWav->
channels;
6118 framesToRead -= framesRead;
6119 totalFramesRead += framesRead;
6122 return totalFramesRead;
6127 if (pWav ==
NULL || framesToRead == 0) {
6131 if (pBufferOut ==
NULL) {
6141 return drwav_read_pcm_frames_s16__pcm(pWav, framesToRead, pBufferOut);
6145 return drwav_read_pcm_frames_s16__ieee(pWav, framesToRead, pBufferOut);
6149 return drwav_read_pcm_frames_s16__alaw(pWav, framesToRead, pBufferOut);
6153 return drwav_read_pcm_frames_s16__mulaw(pWav, framesToRead, pBufferOut);
6157 return drwav_read_pcm_frames_s16__msadpcm(pWav, framesToRead, pBufferOut);
6161 return drwav_read_pcm_frames_s16__ima(pWav, framesToRead, pBufferOut);
6171 drwav__bswap_samples_s16(pBufferOut, framesRead*pWav->
channels);
6180 if (pBufferOut !=
NULL && drwav__is_little_endian() ==
DRWAV_TRUE) {
6181 drwav__bswap_samples_s16(pBufferOut, framesRead*pWav->
channels);
6192 for (
i = 0;
i < sampleCount; ++
i) {
6204 for (
i = 0;
i < sampleCount; ++
i) {
6215 for (
i = 0;
i < sampleCount; ++
i) {
6226 for (
i = 0;
i < sampleCount; ++
i) {
6229 c = ((
x < -1) ? -1 : ((
x > 1) ? 1 :
x));
6231 r = (
int)(
c * 32767.5f);
6241 for (
i = 0;
i < sampleCount; ++
i) {
6244 c = ((
x < -1) ? -1 : ((
x > 1) ? 1 :
x));
6246 r = (
int)(
c * 32767.5);
6255 for (
i = 0;
i < sampleCount; ++
i) {
6256 pOut[
i] = drwav__alaw_to_s16(pIn[
i]);
6263 for (
i = 0;
i < sampleCount; ++
i) {
6264 pOut[
i] = drwav__mulaw_to_s16(pIn[
i]);
6270DRWAV_PRIVATE void drwav__pcm_to_f32(
float* pOut,
const drwav_uint8* pIn,
size_t sampleCount,
unsigned int bytesPerSample)
6275 if (bytesPerSample == 1) {
6281 if (bytesPerSample == 2) {
6285 if (bytesPerSample == 3) {
6289 if (bytesPerSample == 4) {
6296 if (bytesPerSample > 8) {
6297 DRWAV_ZERO_MEMORY(pOut, sampleCount *
sizeof(*pOut));
6303 for (
i = 0;
i < sampleCount; ++
i) {
6305 unsigned int shift = (8 - bytesPerSample) * 8;
6308 for (
j = 0;
j < bytesPerSample;
j += 1) {
6309 DRWAV_ASSERT(
j < 8);
6319DRWAV_PRIVATE void drwav__ieee_to_f32(
float* pOut,
const drwav_uint8* pIn,
size_t sampleCount,
unsigned int bytesPerSample)
6321 if (bytesPerSample == 4) {
6323 for (
i = 0;
i < sampleCount; ++
i) {
6324 *pOut++ = ((
const float*)pIn)[
i];
6327 }
else if (bytesPerSample == 8) {
6332 DRWAV_ZERO_MEMORY(pOut, sampleCount *
sizeof(*pOut));
6342 drwav_uint32 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6344 if (bytesPerFrame == 0) {
6348 totalFramesRead = 0;
6350 while (framesToRead > 0) {
6352 if (framesRead == 0) {
6356 drwav__pcm_to_f32(pBufferOut, sampleData, (
size_t)framesRead*pWav->
channels, bytesPerFrame/pWav->
channels);
6358 pBufferOut += framesRead*pWav->
channels;
6359 framesToRead -= framesRead;
6360 totalFramesRead += framesRead;
6363 return totalFramesRead;
6375 while (framesToRead > 0) {
6377 if (framesRead == 0) {
6383 pBufferOut += framesRead*pWav->
channels;
6384 framesToRead -= framesRead;
6385 totalFramesRead += framesRead;
6388 return totalFramesRead;
6400 while (framesToRead > 0) {
6402 if (framesRead == 0) {
6408 pBufferOut += framesRead*pWav->
channels;
6409 framesToRead -= framesRead;
6410 totalFramesRead += framesRead;
6413 return totalFramesRead;
6427 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6428 if (bytesPerFrame == 0) {
6432 totalFramesRead = 0;
6434 while (framesToRead > 0) {
6436 if (framesRead == 0) {
6440 drwav__ieee_to_f32(pBufferOut, sampleData, (
size_t)(framesRead*pWav->
channels), bytesPerFrame/pWav->
channels);
6442 pBufferOut += framesRead*pWav->
channels;
6443 framesToRead -= framesRead;
6444 totalFramesRead += framesRead;
6447 return totalFramesRead;
6454 drwav_uint32 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6456 if (bytesPerFrame == 0) {
6460 totalFramesRead = 0;
6462 while (framesToRead > 0) {
6464 if (framesRead == 0) {
6470 pBufferOut += framesRead*pWav->
channels;
6471 framesToRead -= framesRead;
6472 totalFramesRead += framesRead;
6475 return totalFramesRead;
6482 drwav_uint32 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6484 if (bytesPerFrame == 0) {
6488 totalFramesRead = 0;
6490 while (framesToRead > 0) {
6492 if (framesRead == 0) {
6498 pBufferOut += framesRead*pWav->
channels;
6499 framesToRead -= framesRead;
6500 totalFramesRead += framesRead;
6503 return totalFramesRead;
6508 if (pWav ==
NULL || framesToRead == 0) {
6512 if (pBufferOut ==
NULL) {
6517 if (framesToRead * pWav->
channels *
sizeof(
float) > DRWAV_SIZE_MAX) {
6518 framesToRead = DRWAV_SIZE_MAX /
sizeof(float) / pWav->
channels;
6522 return drwav_read_pcm_frames_f32__pcm(pWav, framesToRead, pBufferOut);
6526 return drwav_read_pcm_frames_f32__msadpcm(pWav, framesToRead, pBufferOut);
6530 return drwav_read_pcm_frames_f32__ieee(pWav, framesToRead, pBufferOut);
6534 return drwav_read_pcm_frames_f32__alaw(pWav, framesToRead, pBufferOut);
6538 return drwav_read_pcm_frames_f32__mulaw(pWav, framesToRead, pBufferOut);
6542 return drwav_read_pcm_frames_f32__ima(pWav, framesToRead, pBufferOut);
6552 drwav__bswap_samples_f32(pBufferOut, framesRead*pWav->
channels);
6561 if (pBufferOut !=
NULL && drwav__is_little_endian() ==
DRWAV_TRUE) {
6562 drwav__bswap_samples_f32(pBufferOut, framesRead*pWav->
channels);
6577#ifdef DR_WAV_LIBSNDFILE_COMPAT
6584 for (
i = 0;
i < sampleCount; ++
i) {
6585 *pOut++ = (pIn[
i] / 256.0f) * 2 - 1;
6588 for (
i = 0;
i < sampleCount; ++
i) {
6590 x =
x * 0.00784313725490196078f;
6606 for (
i = 0;
i < sampleCount; ++
i) {
6607 *pOut++ = pIn[
i] * 0.000030517578125f;
6619 for (
i = 0;
i < sampleCount; ++
i) {
6626 *pOut++ = (float)(
x * 0.00000011920928955078125);
6637 for (
i = 0;
i < sampleCount; ++
i) {
6638 *pOut++ = (float)(pIn[
i] / 2147483648.0);
6650 for (
i = 0;
i < sampleCount; ++
i) {
6651 *pOut++ = (float)pIn[
i];
6663 for (
i = 0;
i < sampleCount; ++
i) {
6664 *pOut++ = drwav__alaw_to_s16(pIn[
i]) / 32768.0f;
6676 for (
i = 0;
i < sampleCount; ++
i) {
6677 *pOut++ = drwav__mulaw_to_s16(pIn[
i]) / 32768.0f;
6688 if (bytesPerSample == 1) {
6694 if (bytesPerSample == 2) {
6698 if (bytesPerSample == 3) {
6702 if (bytesPerSample == 4) {
6703 for (
i = 0;
i < totalSampleCount; ++
i) {
6711 if (bytesPerSample > 8) {
6712 DRWAV_ZERO_MEMORY(pOut, totalSampleCount *
sizeof(*pOut));
6718 for (
i = 0;
i < totalSampleCount; ++
i) {
6720 unsigned int shift = (8 - bytesPerSample) * 8;
6723 for (
j = 0;
j < bytesPerSample;
j += 1) {
6724 DRWAV_ASSERT(
j < 8);
6736 if (bytesPerSample == 4) {
6739 }
else if (bytesPerSample == 8) {
6744 DRWAV_ZERO_MEMORY(pOut, totalSampleCount *
sizeof(*pOut));
6761 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6762 if (bytesPerFrame == 0) {
6766 totalFramesRead = 0;
6768 while (framesToRead > 0) {
6770 if (framesRead == 0) {
6774 drwav__pcm_to_s32(pBufferOut, sampleData, (
size_t)(framesRead*pWav->
channels), bytesPerFrame/pWav->
channels);
6776 pBufferOut += framesRead*pWav->
channels;
6777 framesToRead -= framesRead;
6778 totalFramesRead += framesRead;
6781 return totalFramesRead;
6793 while (framesToRead > 0) {
6795 if (framesRead == 0) {
6801 pBufferOut += framesRead*pWav->
channels;
6802 framesToRead -= framesRead;
6803 totalFramesRead += framesRead;
6806 return totalFramesRead;
6818 while (framesToRead > 0) {
6820 if (framesRead == 0) {
6826 pBufferOut += framesRead*pWav->
channels;
6827 framesToRead -= framesRead;
6828 totalFramesRead += framesRead;
6831 return totalFramesRead;
6838 drwav_uint32 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6840 if (bytesPerFrame == 0) {
6844 totalFramesRead = 0;
6846 while (framesToRead > 0) {
6848 if (framesRead == 0) {
6852 drwav__ieee_to_s32(pBufferOut, sampleData, (
size_t)(framesRead*pWav->
channels), bytesPerFrame/pWav->
channels);
6854 pBufferOut += framesRead*pWav->
channels;
6855 framesToRead -= framesRead;
6856 totalFramesRead += framesRead;
6859 return totalFramesRead;
6866 drwav_uint32 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6868 if (bytesPerFrame == 0) {
6872 totalFramesRead = 0;
6874 while (framesToRead > 0) {
6876 if (framesRead == 0) {
6882 pBufferOut += framesRead*pWav->
channels;
6883 framesToRead -= framesRead;
6884 totalFramesRead += framesRead;
6887 return totalFramesRead;
6894 drwav_uint32 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav);
6896 if (bytesPerFrame == 0) {
6900 totalFramesRead = 0;
6902 while (framesToRead > 0) {
6904 if (framesRead == 0) {
6910 pBufferOut += framesRead*pWav->
channels;
6911 framesToRead -= framesRead;
6912 totalFramesRead += framesRead;
6915 return totalFramesRead;
6920 if (pWav ==
NULL || framesToRead == 0) {
6924 if (pBufferOut ==
NULL) {
6934 return drwav_read_pcm_frames_s32__pcm(pWav, framesToRead, pBufferOut);
6938 return drwav_read_pcm_frames_s32__msadpcm(pWav, framesToRead, pBufferOut);
6942 return drwav_read_pcm_frames_s32__ieee(pWav, framesToRead, pBufferOut);
6946 return drwav_read_pcm_frames_s32__alaw(pWav, framesToRead, pBufferOut);
6950 return drwav_read_pcm_frames_s32__mulaw(pWav, framesToRead, pBufferOut);
6954 return drwav_read_pcm_frames_s32__ima(pWav, framesToRead, pBufferOut);
6964 drwav__bswap_samples_s32(pBufferOut, framesRead*pWav->
channels);
6973 if (pBufferOut !=
NULL && drwav__is_little_endian() ==
DRWAV_TRUE) {
6974 drwav__bswap_samples_s32(pBufferOut, framesRead*pWav->
channels);
6989 for (
i = 0;
i < sampleCount; ++
i) {
6990 *pOut++ = ((
int)pIn[
i] - 128) << 24;
7002 for (
i = 0;
i < sampleCount; ++
i) {
7003 *pOut++ = pIn[
i] << 16;
7015 for (
i = 0;
i < sampleCount; ++
i) {
7016 unsigned int s0 = pIn[
i*3 + 0];
7017 unsigned int s1 = pIn[
i*3 + 1];
7018 unsigned int s2 = pIn[
i*3 + 2];
7033 for (
i = 0;
i < sampleCount; ++
i) {
7046 for (
i = 0;
i < sampleCount; ++
i) {
7059 for (
i = 0;
i < sampleCount; ++
i) {
7060 *pOut++ = ((
drwav_int32)drwav__alaw_to_s16(pIn[
i])) << 16;
7072 for (
i= 0;
i < sampleCount; ++
i) {
7073 *pOut++ = ((
drwav_int32)drwav__mulaw_to_s16(pIn[
i])) << 16;
7085 DRWAV_ASSERT(pWav !=
NULL);
7088 if (sampleDataSize > DRWAV_SIZE_MAX) {
7094 if (pSampleData ==
NULL) {
7114 if (totalFrameCount) {
7121DRWAV_PRIVATE float* drwav__read_pcm_frames_and_close_f32(
drwav* pWav,
unsigned int* channels,
unsigned int* sampleRate,
drwav_uint64* totalFrameCount)
7127 DRWAV_ASSERT(pWav !=
NULL);
7130 if (sampleDataSize > DRWAV_SIZE_MAX) {
7135 pSampleData = (
float*)drwav__malloc_from_callbacks((
size_t)sampleDataSize, &pWav->
allocationCallbacks);
7136 if (pSampleData ==
NULL) {
7156 if (totalFrameCount) {
7169 DRWAV_ASSERT(pWav !=
NULL);
7172 if (sampleDataSize > DRWAV_SIZE_MAX) {
7178 if (pSampleData ==
NULL) {
7198 if (totalFrameCount) {
7214 if (sampleRateOut) {
7217 if (totalFrameCountOut) {
7218 *totalFrameCountOut = 0;
7221 if (!
drwav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) {
7225 return drwav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7235 if (sampleRateOut) {
7238 if (totalFrameCountOut) {
7239 *totalFrameCountOut = 0;
7242 if (!
drwav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) {
7246 return drwav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7256 if (sampleRateOut) {
7259 if (totalFrameCountOut) {
7260 *totalFrameCountOut = 0;
7263 if (!
drwav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) {
7267 return drwav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7270#ifndef DR_WAV_NO_STDIO
7278 if (sampleRateOut) {
7281 if (totalFrameCountOut) {
7282 *totalFrameCountOut = 0;
7289 return drwav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7299 if (sampleRateOut) {
7302 if (totalFrameCountOut) {
7303 *totalFrameCountOut = 0;
7310 return drwav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7320 if (sampleRateOut) {
7323 if (totalFrameCountOut) {
7324 *totalFrameCountOut = 0;
7331 return drwav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7339 if (sampleRateOut) {
7345 if (totalFrameCountOut) {
7346 *totalFrameCountOut = 0;
7353 return drwav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7360 if (sampleRateOut) {
7366 if (totalFrameCountOut) {
7367 *totalFrameCountOut = 0;
7374 return drwav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7381 if (sampleRateOut) {
7387 if (totalFrameCountOut) {
7388 *totalFrameCountOut = 0;
7395 return drwav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7406 if (sampleRateOut) {
7409 if (totalFrameCountOut) {
7410 *totalFrameCountOut = 0;
7417 return drwav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7427 if (sampleRateOut) {
7430 if (totalFrameCountOut) {
7431 *totalFrameCountOut = 0;
7438 return drwav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7448 if (sampleRateOut) {
7451 if (totalFrameCountOut) {
7452 *totalFrameCountOut = 0;
7459 return drwav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
7466 if (pAllocationCallbacks !=
NULL) {
7467 drwav__free_from_callbacks(
p, pAllocationCallbacks);
7469 drwav__free_default(
p,
NULL);
7520 for (
i = 0;
i < 16;
i += 1) {
uint8_t a
Definition Spc_Cpu.h:141
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
* e
Definition inflate.c:1404
struct huft * t
Definition inflate.c:943
register unsigned j
Definition inflate.c:1576
struct huft * u[BMAX]
Definition inflate.c:1583
register unsigned i
Definition inflate.c:1575
unsigned x[BMAX+1]
Definition inflate.c:1586
unsigned f
Definition inflate.c:1572
#define DRWAV_BUSY
Definition dr_wav.h:217
DRWAV_API void drwav_s32_to_s16(drwav_int16 *pOut, const drwav_int32 *pIn, size_t sampleCount)
drwav_uint8 drwav_bool8
Definition dr_wav.h:162
DRWAV_API drwav_bool32 drwav_init_with_metadata(drwav *pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, void *pUserData, drwav_uint32 flags, const drwav_allocation_callbacks *pAllocationCallbacks)
drwav_metadata_location
Definition dr_wav.h:768
@ drwav_metadata_location_invalid
Definition dr_wav.h:769
@ drwav_metadata_location_inside_info_list
Definition dr_wav.h:771
@ drwav_metadata_location_inside_adtl_list
Definition dr_wav.h:772
@ drwav_metadata_location_top_level
Definition dr_wav.h:770
DRWAV_API drwav_bool32 drwav_init_file_ex_w(drwav *pWav, const wchar_t *filename, drwav_chunk_proc onChunk, void *pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API void drwav_f32_to_s16(drwav_int16 *pOut, const float *pIn, size_t sampleCount)
#define DRWAV_OUT_OF_RANGE
Definition dr_wav.h:203
#define DRWAV_FALSE
Definition dr_wav.h:165
#define DRWAV_TIMEOUT
Definition dr_wav.h:232
drwav_container
Definition dr_wav.h:275
@ drwav_container_w64
Definition dr_wav.h:277
@ drwav_container_riff
Definition dr_wav.h:276
@ drwav_container_rf64
Definition dr_wav.h:278
#define DRWAV_VERSION_MINOR
Definition dr_wav.h:127
#define DRWAV_TOO_BIG
Definition dr_wav.h:209
DRWAV_API drwav_bool32 drwav_init_file_with_metadata(drwav *pWav, const char *filename, drwav_uint32 flags, const drwav_allocation_callbacks *pAllocationCallbacks)
#define DRWAV_SOCKET_NOT_SUPPORTED
Definition dr_wav.h:242
#define DRWAV_ACCESS_DENIED
Definition dr_wav.h:204
DRWAV_API drwav_bool32 drwav_init_file_write_sequential_pcm_frames_w(drwav *pWav, const wchar_t *filename, const drwav_data_format *pFormat, drwav_uint64 totalPCMFrameCount, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API void drwav_s24_to_f32(float *pOut, const drwav_uint8 *pIn, size_t sampleCount)
DRWAV_API void drwav_s32_to_f32(float *pOut, const drwav_int32 *pIn, size_t sampleCount)
#define DRWAV_TOO_MANY_LINKS
Definition dr_wav.h:226
drwav_smpl_loop_type
Definition dr_wav.h:511
@ drwav_smpl_loop_type_backward
Definition dr_wav.h:514
@ drwav_smpl_loop_type_pingpong
Definition dr_wav.h:513
@ drwav_smpl_loop_type_forward
Definition dr_wav.h:512
#define DRWAV_SEQUENTIAL
Definition dr_wav.h:263
drwav_int32 drwav_result
Definition dr_wav.h:197
#define DRWAV_INVALID_DATA
Definition dr_wav.h:231
DRWAV_API drwav_uint64 drwav_write_pcm_frames_be(drwav *pWav, drwav_uint64 framesToWrite, const void *pData)
#define DRWAV_NO_ADDRESS
Definition dr_wav.h:236
#define DRWAV_IO_ERROR
Definition dr_wav.h:218
DRWAV_API drwav_int32 * drwav_open_memory_and_read_pcm_frames_s32(const void *data, size_t dataSize, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API const char * drwav_version_string(void)
DRWAV_API drwav_uint64 drwav_read_pcm_frames_be(drwav *pWav, drwav_uint64 framesToRead, void *pBufferOut)
DRWAV_API drwav_uint64 drwav_bytes_to_u64(const drwav_uint8 *data)
#define DRWAV_UNAVAILABLE
Definition dr_wav.h:220
DRWAV_API void drwav_free(void *p, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API void drwav_alaw_to_s32(drwav_int32 *pOut, const drwav_uint8 *pIn, size_t sampleCount)
DRWAV_API drwav_bool32 drwav_init_write_sequential_pcm_frames(drwav *pWav, const drwav_data_format *pFormat, drwav_uint64 totalPCMFrameCount, drwav_write_proc onWrite, void *pUserData, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API void drwav_f64_to_s16(drwav_int16 *pOut, const double *pIn, size_t sampleCount)
DRWAV_API drwav_bool32 drwav_init_file_write_sequential_pcm_frames(drwav *pWav, const char *filename, const drwav_data_format *pFormat, drwav_uint64 totalPCMFrameCount, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_uint64 drwav_read_pcm_frames_le(drwav *pWav, drwav_uint64 framesToRead, void *pBufferOut)
drwav_bool32(* drwav_seek_proc)(void *pUserData, int offset, drwav_seek_origin origin)
Definition dr_wav.h:381
DRWAV_API void drwav_s24_to_s32(drwav_int32 *pOut, const drwav_uint8 *pIn, size_t sampleCount)
#define DRWAV_ADDRESS_FAMILY_NOT_SUPPORTED
Definition dr_wav.h:241
#define DRWAV_ERROR
Definition dr_wav.h:199
drwav_uint32 drwav_bool32
Definition dr_wav.h:163
#define DRWAV_NOT_DIRECTORY
Definition dr_wav.h:212
DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32be(drwav *pWav, drwav_uint64 framesToRead, float *pBufferOut)
#define DR_WAVE_FORMAT_DVI_ADPCM
Definition dr_wav.h:259
#define DRWAV_VERSION_STRING
Definition dr_wav.h:129
DRWAV_API void drwav_f64_to_f32(float *pOut, const double *pIn, size_t sampleCount)
#define DRWAV_INVALID_ARGS
Definition dr_wav.h:200
#define DRWAV_PROTOCOL_UNAVAILABLE
Definition dr_wav.h:238
DRWAV_API drwav_int16 * drwav_open_file_and_read_pcm_frames_s16_w(const wchar_t *filename, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
#define DR_WAVE_FORMAT_EXTENSIBLE
Definition dr_wav.h:260
DRWAV_API drwav_bool32 drwav_init_file_w(drwav *pWav, const wchar_t *filename, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_int32 * drwav_open_file_and_read_pcm_frames_s32_w(const wchar_t *filename, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API size_t drwav_write_raw(drwav *pWav, size_t bytesToWrite, const void *pData)
DRWAV_API void drwav_u8_to_s32(drwav_int32 *pOut, const drwav_uint8 *pIn, size_t sampleCount)
DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16le(drwav *pWav, drwav_uint64 framesToRead, drwav_int16 *pBufferOut)
DRWAV_API float * drwav_open_file_and_read_pcm_frames_f32_w(const wchar_t *filename, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32(drwav *pWav, drwav_uint64 framesToRead, float *pBufferOut)
drwav_uint32 drwav_uintptr
Definition dr_wav.h:160
DRWAV_API drwav_metadata * drwav_take_ownership_of_metadata(drwav *pWav)
#define DRWAV_ALREADY_IN_USE
Definition dr_wav.h:221
#define DRWAV_PROTOCOL_FAMILY_NOT_SUPPORTED
Definition dr_wav.h:240
DRWAV_API drwav_bool32 drwav_init_file_ex(drwav *pWav, const char *filename, drwav_chunk_proc onChunk, void *pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_bool32 drwav_init_write_sequential(drwav *pWav, const drwav_data_format *pFormat, drwav_uint64 totalSampleCount, drwav_write_proc onWrite, void *pUserData, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API float drwav_bytes_to_f32(const drwav_uint8 *data)
#define DR_WAVE_FORMAT_MULAW
Definition dr_wav.h:258
DRWAV_API drwav_bool32 drwav_guid_equal(const drwav_uint8 a[16], const drwav_uint8 b[16])
DRWAV_API drwav_int32 * drwav_open_file_and_read_pcm_frames_s32(const char *filename, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_int16 * drwav_open_file_and_read_pcm_frames_s16(const char *filename, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API void drwav_s16_to_f32(float *pOut, const drwav_int16 *pIn, size_t sampleCount)
#define DRWAV_OUT_OF_MEMORY
Definition dr_wav.h:202
signed int drwav_int32
Definition dr_wav.h:138
drwav_uint64(* drwav_chunk_proc)(void *pChunkUserData, drwav_read_proc onRead, drwav_seek_proc onSeek, void *pReadSeekUserData, const drwav_chunk_header *pChunkHeader, drwav_container container, const drwav_fmt *pFMT)
Definition dr_wav.h:407
DRWAV_API drwav_bool32 drwav_init_memory_write(drwav *pWav, void **ppData, size_t *pDataSize, const drwav_data_format *pFormat, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_bool32 drwav_init_memory_write_sequential_pcm_frames(drwav *pWav, void **ppData, size_t *pDataSize, const drwav_data_format *pFormat, drwav_uint64 totalPCMFrameCount, const drwav_allocation_callbacks *pAllocationCallbacks)
#define DRWAV_NO_NETWORK
Definition dr_wav.h:233
DRWAV_API drwav_uint32 drwav_bytes_to_u32(const drwav_uint8 *data)
#define DRWAV_BAD_MESSAGE
Definition dr_wav.h:229
#define DRWAV_PATH_TOO_LONG
Definition dr_wav.h:210
#define DRWAV_NOT_SOCKET
Definition dr_wav.h:235
DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32be(drwav *pWav, drwav_uint64 framesToRead, drwav_int32 *pBufferOut)
DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32le(drwav *pWav, drwav_uint64 framesToRead, float *pBufferOut)
DRWAV_API size_t drwav_read_raw(drwav *pWav, size_t bytesToRead, void *pBufferOut)
DRWAV_API void drwav_f64_to_s32(drwav_int32 *pOut, const double *pIn, size_t sampleCount)
signed short drwav_int16
Definition dr_wav.h:136
DRWAV_API drwav_bool32 drwav_init_write_with_metadata(drwav *pWav, const drwav_data_format *pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void *pUserData, const drwav_allocation_callbacks *pAllocationCallbacks, drwav_metadata *pMetadata, drwav_uint32 metadataCount)
DRWAV_API void drwav_alaw_to_f32(float *pOut, const drwav_uint8 *pIn, size_t sampleCount)
DRWAV_API drwav_uint16 drwav_fmt_get_format(const drwav_fmt *pFMT)
DRWAV_API float * drwav_open_memory_and_read_pcm_frames_f32(const void *data, size_t dataSize, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_bool32 drwav_init_file_write_w(drwav *pWav, const wchar_t *filename, const drwav_data_format *pFormat, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_bool32 drwav_init_memory(drwav *pWav, const void *data, size_t dataSize, const drwav_allocation_callbacks *pAllocationCallbacks)
#define DRWAV_NO_SPACE
Definition dr_wav.h:216
DRWAV_API drwav_bool32 drwav_init_memory_write_sequential(drwav *pWav, void **ppData, size_t *pDataSize, const drwav_data_format *pFormat, drwav_uint64 totalSampleCount, const drwav_allocation_callbacks *pAllocationCallbacks)
#define DR_WAVE_FORMAT_PCM
Definition dr_wav.h:254
#define DRWAV_NO_DATA_AVAILABLE
Definition dr_wav.h:230
unsigned int drwav_uint32
Definition dr_wav.h:139
#define DRWAV_INVALID_FILE
Definition dr_wav.h:208
DRWAV_API void drwav_f32_to_s32(drwav_int32 *pOut, const float *pIn, size_t sampleCount)
#define DRWAV_NOT_CONNECTED
Definition dr_wav.h:245
DRWAV_API drwav_int64 drwav_bytes_to_s64(const drwav_uint8 *data)
DRWAV_API drwav_bool32 drwav_init_file_with_metadata_w(drwav *pWav, const wchar_t *filename, drwav_uint32 flags, const drwav_allocation_callbacks *pAllocationCallbacks)
#define DRWAV_BAD_PROTOCOL
Definition dr_wav.h:237
#define DRWAV_DOES_NOT_EXIST
Definition dr_wav.h:205
DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32(drwav *pWav, drwav_uint64 framesToRead, drwav_int32 *pBufferOut)
DRWAV_API drwav_uint64 drwav_write_pcm_frames_le(drwav *pWav, drwav_uint64 framesToWrite, const void *pData)
#define DRWAV_IS_DIRECTORY
Definition dr_wav.h:213
#define DRWAV_BAD_ADDRESS
Definition dr_wav.h:222
DRWAV_API drwav_int32 drwav_bytes_to_s32(const drwav_uint8 *data)
#define DRWAV_BAD_SEEK
Definition dr_wav.h:223
DRWAV_API drwav_bool32 drwav_init_file(drwav *pWav, const char *filename, const drwav_allocation_callbacks *pAllocationCallbacks)
#define DRWAV_CANCELLED
Definition dr_wav.h:249
drwav_seek_origin
Definition dr_wav.h:269
@ drwav_seek_origin_current
Definition dr_wav.h:271
@ drwav_seek_origin_start
Definition dr_wav.h:270
#define DRWAV_ALREADY_EXISTS
Definition dr_wav.h:206
DRWAV_API drwav_bool32 drwav_init_file_write(drwav *pWav, const char *filename, const drwav_data_format *pFormat, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_bool32 drwav_seek_to_pcm_frame(drwav *pWav, drwav_uint64 targetFrameIndex)
DRWAV_API void drwav_mulaw_to_s16(drwav_int16 *pOut, const drwav_uint8 *pIn, size_t sampleCount)
#define DR_WAVE_FORMAT_ALAW
Definition dr_wav.h:257
DRWAV_API drwav_bool32 drwav_fourcc_equal(const drwav_uint8 *a, const char *b)
DRWAV_API drwav_bool32 drwav_init_memory_ex(drwav *pWav, const void *data, size_t dataSize, drwav_chunk_proc onChunk, void *pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API void drwav_s16_to_s32(drwav_int32 *pOut, const drwav_int16 *pIn, size_t sampleCount)
#define DRWAV_VERSION_MAJOR
Definition dr_wav.h:126
#define DRWAV_TRUE
Definition dr_wav.h:164
#define DR_WAVE_FORMAT_ADPCM
Definition dr_wav.h:255
DRWAV_API void drwav_alaw_to_s16(drwav_int16 *pOut, const drwav_uint8 *pIn, size_t sampleCount)
DRWAV_API void drwav_mulaw_to_s32(drwav_int32 *pOut, const drwav_uint8 *pIn, size_t sampleCount)
#define DRWAV_NOT_IMPLEMENTED
Definition dr_wav.h:227
#define DRWAV_SUCCESS
Definition dr_wav.h:198
DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32le(drwav *pWav, drwav_uint64 framesToRead, drwav_int32 *pBufferOut)
signed char drwav_int8
Definition dr_wav.h:134
DRWAV_API void drwav_mulaw_to_f32(float *pOut, const drwav_uint8 *pIn, size_t sampleCount)
DRWAV_API drwav_result drwav_get_length_in_pcm_frames(drwav *pWav, drwav_uint64 *pLength)
#define DRWAV_NO_MESSAGE
Definition dr_wav.h:228
size_t(* drwav_write_proc)(void *pUserData, const void *pData, size_t bytesToWrite)
Definition dr_wav.h:367
DRWAV_API drwav_uint16 drwav_bytes_to_u16(const drwav_uint8 *data)
DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16be(drwav *pWav, drwav_uint64 framesToRead, drwav_int16 *pBufferOut)
#define DRWAV_BAD_PIPE
Definition dr_wav.h:224
#define DRWAV_CONNECTION_RESET
Definition dr_wav.h:243
#define DRWAV_ALREADY_CONNECTED
Definition dr_wav.h:244
#define DRWAV_TOO_MANY_OPEN_FILES
Definition dr_wav.h:207
DRWAV_API drwav_bool32 drwav_init_file_write_sequential_w(drwav *pWav, const wchar_t *filename, const drwav_data_format *pFormat, drwav_uint64 totalSampleCount, const drwav_allocation_callbacks *pAllocationCallbacks)
#define DRWAV_VERSION_REVISION
Definition dr_wav.h:128
#define DRWAV_NOT_UNIQUE
Definition dr_wav.h:234
DRWAV_API float * drwav_open_file_and_read_pcm_frames_f32(const char *filename, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_int16 drwav_bytes_to_s16(const drwav_uint8 *data)
signed long long drwav_int64
Definition dr_wav.h:151
#define DRWAV_PROTOCOL_NOT_SUPPORTED
Definition dr_wav.h:239
DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16(drwav *pWav, drwav_uint64 framesToRead, drwav_int16 *pBufferOut)
DRWAV_API drwav_result drwav_uninit(drwav *pWav)
DRWAV_API void drwav_u8_to_f32(float *pOut, const drwav_uint8 *pIn, size_t sampleCount)
DRWAV_API void drwav_u8_to_s16(drwav_int16 *pOut, const drwav_uint8 *pIn, size_t sampleCount)
unsigned long long drwav_uint64
Definition dr_wav.h:152
DRWAV_API drwav_bool32 drwav_init_memory_with_metadata(drwav *pWav, const void *data, size_t dataSize, drwav_uint32 flags, const drwav_allocation_callbacks *pAllocationCallbacks)
#define DRWAV_DIRECTORY_NOT_EMPTY
Definition dr_wav.h:214
#define DRWAV_CONNECTION_REFUSED
Definition dr_wav.h:246
#define DRWAV_DEADLOCK
Definition dr_wav.h:225
DRWAV_API drwav_uint64 drwav_write_pcm_frames(drwav *pWav, drwav_uint64 framesToWrite, const void *pData)
#define DR_WAVE_FORMAT_IEEE_FLOAT
Definition dr_wav.h:256
DRWAV_API drwav_uint64 drwav_target_write_size_bytes(const drwav_data_format *pFormat, drwav_uint64 totalFrameCount, drwav_metadata *pMetadata, drwav_uint32 metadataCount)
DRWAV_API drwav_int16 * drwav_open_memory_and_read_pcm_frames_s16(const void *data, size_t dataSize, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
unsigned char drwav_uint8
Definition dr_wav.h:135
DRWAV_API void drwav_version(drwav_uint32 *pMajor, drwav_uint32 *pMinor, drwav_uint32 *pRevision)
DRWAV_API drwav_int32 * drwav_open_and_read_pcm_frames_s32(drwav_read_proc onRead, drwav_seek_proc onSeek, void *pUserData, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_int16 * drwav_open_and_read_pcm_frames_s16(drwav_read_proc onRead, drwav_seek_proc onSeek, void *pUserData, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_bool32 drwav_init_file_write_sequential(drwav *pWav, const char *filename, const drwav_data_format *pFormat, drwav_uint64 totalSampleCount, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API float * drwav_open_and_read_pcm_frames_f32(drwav_read_proc onRead, drwav_seek_proc onSeek, void *pUserData, unsigned int *channelsOut, unsigned int *sampleRateOut, drwav_uint64 *totalFrameCountOut, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_result drwav_get_cursor_in_pcm_frames(drwav *pWav, drwav_uint64 *pCursor)
DRWAV_API drwav_bool32 drwav_init(drwav *pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, void *pUserData, const drwav_allocation_callbacks *pAllocationCallbacks)
DRWAV_API drwav_bool32 drwav_init_write(drwav *pWav, const drwav_data_format *pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void *pUserData, const drwav_allocation_callbacks *pAllocationCallbacks)
#define DRWAV_INTERRUPT
Definition dr_wav.h:219
drwav_metadata_type
Definition dr_wav.h:445
@ drwav_metadata_type_list_all_adtl
Definition dr_wav.h:496
@ drwav_metadata_type_list_info_tracknumber
Definition dr_wav.h:483
@ drwav_metadata_type_list_all_info_strings
Definition dr_wav.h:486
@ drwav_metadata_type_none
Definition dr_wav.h:446
@ drwav_metadata_type_list_info_artist
Definition dr_wav.h:478
@ drwav_metadata_type_list_info_comment
Definition dr_wav.h:479
@ drwav_metadata_type_list_info_date
Definition dr_wav.h:480
@ drwav_metadata_type_bext
Definition dr_wav.h:462
@ drwav_metadata_type_list_info_genre
Definition dr_wav.h:481
@ drwav_metadata_type_list_info_album
Definition dr_wav.h:482
@ drwav_metadata_type_list_label
Definition dr_wav.h:471
@ drwav_metadata_type_acid
Definition dr_wav.h:461
@ drwav_metadata_type_unknown
Definition dr_wav.h:455
@ drwav_metadata_type_list_info_software
Definition dr_wav.h:475
@ drwav_metadata_type_cue
Definition dr_wav.h:460
@ drwav_metadata_type_list_labelled_cue_region
Definition dr_wav.h:473
@ drwav_metadata_type_smpl
Definition dr_wav.h:458
@ drwav_metadata_type_list_info_title
Definition dr_wav.h:477
@ drwav_metadata_type_list_info_copyright
Definition dr_wav.h:476
@ drwav_metadata_type_all_including_unknown
Definition dr_wav.h:501
@ drwav_metadata_type_all
Definition dr_wav.h:500
@ drwav_metadata_type_inst
Definition dr_wav.h:459
@ drwav_metadata_type_list_note
Definition dr_wav.h:472
#define DRWAV_INVALID_OPERATION
Definition dr_wav.h:201
size_t(* drwav_read_proc)(void *pUserData, void *pBufferOut, size_t bytesToRead)
Definition dr_wav.h:354
DRWAV_API void drwav_s24_to_s16(drwav_int16 *pOut, const drwav_uint8 *pIn, size_t sampleCount)
unsigned short drwav_uint16
Definition dr_wav.h:137
#define DRWAV_IN_PROGRESS
Definition dr_wav.h:248
#define DRWAV_NO_HOST
Definition dr_wav.h:247
DRWAV_API drwav_bool32 drwav_init_ex(drwav *pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, drwav_chunk_proc onChunk, void *pReadSeekUserData, void *pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks *pAllocationCallbacks)
drwav_acid_flag
Definition dr_wav.h:623
@ drwav_acid_flag_acidizer
Definition dr_wav.h:628
@ drwav_acid_flag_one_shot
Definition dr_wav.h:624
@ drwav_acid_flag_root_note_set
Definition dr_wav.h:625
@ drwav_acid_flag_stretch
Definition dr_wav.h:626
@ drwav_acid_flag_disk_based
Definition dr_wav.h:627
#define DRWAV_AT_END
Definition dr_wav.h:251
DRWAV_API drwav_uint64 drwav_read_pcm_frames(drwav *pWav, drwav_uint64 framesToRead, void *pBufferOut)
static char filename[]
Definition features.c:5
static void u32(register WDL_FFT_COMPLEX *a)
Definition fft.c:823
static PuglViewHint int value
Definition pugl.h:1708
JSAMPIMAGE data
Definition jpeglib.h:945
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
JOCTET * buffer
Definition juce_JPEGLoader.cpp:302
jack_client_t client jack_client_t client jack_client_t client jack_client_t JackInfoShutdownCallback void arg jack_client_t jack_port_t port void func jack_client_t const char const char unsigned long flags
Definition juce_linux_JackAudio.cpp:69
static bool diff(const std::string fn1, const std::string fn2)
Definition playertest.cpp:161
void ** ppData
Definition dr_wav.h:428
size_t dataCapacity
Definition dr_wav.h:431
size_t dataSize
Definition dr_wav.h:430
size_t * pDataSize
Definition dr_wav.h:429
size_t currentWritePos
Definition dr_wav.h:432
const drwav_uint8 * data
Definition dr_wav.h:420
size_t dataSize
Definition dr_wav.h:421
size_t currentReadPos
Definition dr_wav.h:422
drwav_uint16 reserved1
Definition dr_wav.h:640
drwav_uint16 midiUnityNote
Definition dr_wav.h:637
drwav_uint32 flags
Definition dr_wav.h:634
float tempo
Definition dr_wav.h:651
drwav_uint32 numBeats
Definition dr_wav.h:644
drwav_uint16 meterNumerator
Definition dr_wav.h:648
float reserved2
Definition dr_wav.h:641
drwav_uint16 meterDenominator
Definition dr_wav.h:647
void *(* onRealloc)(void *p, size_t sz, void *pUserData)
Definition dr_wav.h:413
void(* onFree)(void *p, void *pUserData)
Definition dr_wav.h:414
void * pUserData
Definition dr_wav.h:411
void *(* onMalloc)(size_t sz, void *pUserData)
Definition dr_wav.h:412
drwav_uint16 version
Definition dr_wav.h:692
char * pOriginatorName
Definition dr_wav.h:687
char * pCodingHistory
Definition dr_wav.h:698
drwav_uint16 maxTruePeakLevel
Definition dr_wav.h:707
drwav_uint16 loudnessValue
Definition dr_wav.h:705
char pOriginationTime[8]
Definition dr_wav.h:690
char pOriginationDate[10]
Definition dr_wav.h:689
char * pOriginatorReference
Definition dr_wav.h:688
drwav_uint16 maxShortTermLoudness
Definition dr_wav.h:709
drwav_uint16 maxMomentaryLoudness
Definition dr_wav.h:708
char * pDescription
Definition dr_wav.h:686
drwav_uint32 codingHistorySize
Definition dr_wav.h:699
drwav_uint16 loudnessRange
Definition dr_wav.h:706
drwav_uint64 timeReference
Definition dr_wav.h:691
drwav_uint8 * pUMID
Definition dr_wav.h:702
drwav_uint32 blockStart
Definition dr_wav.h:605
drwav_uint32 id
Definition dr_wav.h:593
drwav_uint8 dataChunkId[4]
Definition dr_wav.h:599
drwav_uint32 sampleByteOffset
Definition dr_wav.h:608
drwav_uint32 playOrderPosition
Definition dr_wav.h:596
drwav_uint32 chunkStart
Definition dr_wav.h:602
drwav_uint32 cuePointCount
Definition dr_wav.h:613
drwav_cue_point * pCuePoints
Definition dr_wav.h:614
drwav_uint16 bitsPerSample
Definition dr_wav.h:320
drwav_uint16 formatTag
Definition dr_wav.h:305
drwav_uint32 avgBytesPerSec
Definition dr_wav.h:314
drwav_uint32 channelMask
Definition dr_wav.h:333
drwav_uint32 sampleRate
Definition dr_wav.h:311
drwav_uint16 blockAlign
Definition dr_wav.h:317
drwav_uint16 channels
Definition dr_wav.h:308
drwav_uint8 subFormat[16]
Definition dr_wav.h:336
drwav_uint16 validBitsPerSample
Definition dr_wav.h:330
drwav_uint16 extendedSize
Definition dr_wav.h:323
drwav_int8 highVelocity
Definition dr_wav.h:581
drwav_int8 lowNote
Definition dr_wav.h:578
drwav_int8 midiUnityNote
Definition dr_wav.h:575
drwav_int8 highNote
Definition dr_wav.h:579
drwav_int8 gainDecibels
Definition dr_wav.h:577
drwav_int8 lowVelocity
Definition dr_wav.h:580
drwav_int8 fineTuneCents
Definition dr_wav.h:576
char * pString
Definition dr_wav.h:725
drwav_uint32 stringLength
Definition dr_wav.h:722
char * pString
Definition dr_wav.h:670
drwav_uint32 stringLength
Definition dr_wav.h:667
drwav_uint32 cuePointId
Definition dr_wav.h:664
drwav_uint8 purposeId[4]
Definition dr_wav.h:743
char * pString
Definition dr_wav.h:755
drwav_uint16 country
Definition dr_wav.h:746
drwav_uint16 language
Definition dr_wav.h:747
drwav_uint32 stringLength
Definition dr_wav.h:752
drwav_uint32 cuePointId
Definition dr_wav.h:737
drwav_uint16 codePage
Definition dr_wav.h:749
drwav_uint16 dialect
Definition dr_wav.h:748
drwav_uint32 sampleLength
Definition dr_wav.h:740
drwav_uint32 sampleFraction
Definition dr_wav.h:532
drwav_uint32 cuePointId
Definition dr_wav.h:520
drwav_uint32 firstSampleByteOffset
Definition dr_wav.h:526
drwav_uint32 type
Definition dr_wav.h:523
drwav_uint32 lastSampleByteOffset
Definition dr_wav.h:529
drwav_uint32 playCount
Definition dr_wav.h:535
drwav_uint32 manufacturerId
Definition dr_wav.h:541
drwav_uint32 samplePeriodNanoseconds
Definition dr_wav.h:545
drwav_uint32 midiPitchFraction
Definition dr_wav.h:551
drwav_uint32 smpteOffset
Definition dr_wav.h:555
drwav_uint8 * pSamplerSpecificData
Definition dr_wav.h:564
drwav_uint32 smpteFormat
Definition dr_wav.h:554
drwav_uint32 sampleLoopCount
Definition dr_wav.h:558
drwav_uint32 samplerSpecificDataSizeInBytes
Definition dr_wav.h:561
drwav_uint32 productId
Definition dr_wav.h:542
drwav_smpl_loop * pLoops
Definition dr_wav.h:563
drwav_uint32 midiUnityNote
Definition dr_wav.h:548
drwav_uint32 metadataCount
Definition dr_wav.h:874
drwav_uint64 dataChunkDataSizeTargetWrite
Definition dr_wav.h:863
drwav_uint16 predictor[2]
Definition dr_wav.h:886
drwav_write_proc onWrite
Definition dr_wav.h:811
drwav_container container
Definition dr_wav.h:824
drwav_int32 prevFrames[2][2]
Definition dr_wav.h:890
drwav_metadata_type allowedMetadataTypes
Definition dr_wav.h:870
drwav_uint64 readCursorInPCMFrames
Definition dr_wav.h:856
drwav_int32 cachedFrames[4]
Definition dr_wav.h:888
struct drwav::@113222222142340354312304062167117015246337043174 msadpcm
drwav_int32 stepIndex[2]
Definition dr_wav.h:898
drwav_uint16 channels
Definition dr_wav.h:834
drwav_int32 delta[2]
Definition dr_wav.h:887
drwav__memory_stream memoryStream
Definition dr_wav.h:878
drwav_allocation_callbacks allocationCallbacks
Definition dr_wav.h:820
drwav__memory_stream_write memoryStreamWrite
Definition dr_wav.h:879
drwav_bool32 isSequentialWrite
Definition dr_wav.h:866
drwav_uint32 sampleRate
Definition dr_wav.h:831
drwav_seek_proc onSeek
Definition dr_wav.h:814
drwav_uint16 translatedFormatTag
Definition dr_wav.h:840
drwav_fmt fmt
Definition dr_wav.h:828
void * pUserData
Definition dr_wav.h:817
drwav_uint64 dataChunkDataSize
Definition dr_wav.h:847
drwav_uint32 bytesRemainingInBlock
Definition dr_wav.h:885
drwav_read_proc onRead
Definition dr_wav.h:808
drwav_uint16 bitsPerSample
Definition dr_wav.h:837
drwav_uint64 dataChunkDataPos
Definition dr_wav.h:850
drwav_uint64 totalPCMFrameCount
Definition dr_wav.h:843
drwav_metadata * pMetadata
Definition dr_wav.h:873
drwav_uint32 cachedFrameCount
Definition dr_wav.h:889
drwav_uint64 bytesRemaining
Definition dr_wav.h:853
struct drwav::@065174307045176361106105171241022247164220167157 ima
signed int sample
Definition tap_dynamics_m.c:41
int n
Definition crypt.c:458
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
memcpy(hh, h, RAND_HEAD_LEN)
int r
Definition crypt.c:458
fmt[0]
Definition fileio.c:2503
int result
Definition process.c:1455
typedef int(UZ_EXP MsgFn)()
#define void
Definition unzip.h:396
#define SEEK_SET
Definition unzpriv.h:1302
#define SEEK_CUR
Definition unzpriv.h:1303
#define EPIPE
Definition unzpriv.h:1089
_WDL_CSTRING_PREFIX void INT_PTR const char * format
Definition wdlcstring.h:263
#define DRWAV_API
Definition ysfx_audio_wav.cpp:29
#define DRWAV_PRIVATE
Definition ysfx_audio_wav.cpp:30