system/ByteOrder: new library for byte ordering / endianess
Replacing GLib macros.
This commit is contained in:
parent
08eca827b6
commit
5e26e2ab1d
@ -33,6 +33,7 @@
|
||||
#include "CheckAudioFormat.hxx"
|
||||
#include "util/bit_reverse.h"
|
||||
#include "util/Error.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
#include "tag/TagHandler.hxx"
|
||||
#include "DsdLib.hxx"
|
||||
#include "Log.hxx"
|
||||
@ -56,8 +57,8 @@ struct DsdiffChunkHeader {
|
||||
*/
|
||||
gcc_const
|
||||
uint64_t GetSize() const {
|
||||
return (((uint64_t)GUINT32_FROM_BE(size_high)) << 32) |
|
||||
((uint64_t)GUINT32_FROM_BE(size_low));
|
||||
return (uint64_t(FromBE32(size_high)) << 32) |
|
||||
uint64_t(FromBE32(size_low));
|
||||
}
|
||||
};
|
||||
|
||||
@ -141,7 +142,7 @@ dsdiff_read_prop_snd(struct decoder *decoder, struct input_stream *is,
|
||||
sizeof(sample_rate)))
|
||||
return false;
|
||||
|
||||
metadata->sample_rate = GUINT32_FROM_BE(sample_rate);
|
||||
metadata->sample_rate = FromBE32(sample_rate);
|
||||
} else if (dsdlib_id_equals(&header.id, "CHNL")) {
|
||||
uint16_t channels;
|
||||
if (header.GetSize() < sizeof(channels) ||
|
||||
@ -150,7 +151,7 @@ dsdiff_read_prop_snd(struct decoder *decoder, struct input_stream *is,
|
||||
!dsdlib_skip_to(decoder, is, chunk_end_offset))
|
||||
return false;
|
||||
|
||||
metadata->channels = GUINT16_FROM_BE(channels);
|
||||
metadata->channels = FromBE16(channels);
|
||||
} else if (dsdlib_id_equals(&header.id, "CMPR")) {
|
||||
struct dsdlib_id type;
|
||||
if (header.GetSize() < sizeof(type) ||
|
||||
@ -211,7 +212,7 @@ dsdiff_handle_native_tag(struct input_stream *is,
|
||||
if (!dsdlib_read(nullptr, is, &metatag, sizeof(metatag)))
|
||||
return;
|
||||
|
||||
uint32_t length = GUINT32_FROM_BE(metatag.size);
|
||||
uint32_t length = FromBE32(metatag.size);
|
||||
|
||||
/* Check and limit size of the tag to prevent a stack overflow */
|
||||
if (length == 0 || length > 60)
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "CheckAudioFormat.hxx"
|
||||
#include "util/bit_reverse.h"
|
||||
#include "util/Error.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
#include "DsdLib.hxx"
|
||||
#include "tag/TagHandler.hxx"
|
||||
#include "Log.hxx"
|
||||
@ -107,16 +108,16 @@ dsf_read_metadata(struct decoder *decoder, struct input_stream *is,
|
||||
!dsdlib_id_equals(&dsf_header.id, "DSD "))
|
||||
return false;
|
||||
|
||||
chunk_size = (((uint64_t)GUINT32_FROM_LE(dsf_header.size_high)) << 32) |
|
||||
((uint64_t)GUINT32_FROM_LE(dsf_header.size_low));
|
||||
chunk_size = (uint64_t(FromLE32(dsf_header.size_high)) << 32) |
|
||||
uint64_t(FromLE32(dsf_header.size_low));
|
||||
|
||||
if (sizeof(dsf_header) != chunk_size)
|
||||
return false;
|
||||
|
||||
#ifdef HAVE_ID3TAG
|
||||
uint64_t metadata_offset;
|
||||
metadata_offset = (((uint64_t)GUINT32_FROM_LE(dsf_header.pmeta_high)) << 32) |
|
||||
((uint64_t)GUINT32_FROM_LE(dsf_header.pmeta_low));
|
||||
metadata_offset = (uint64_t(FromLE32(dsf_header.pmeta_high)) << 32) |
|
||||
uint64_t(FromLE32(dsf_header.pmeta_low));
|
||||
#endif
|
||||
|
||||
/* read the 'fmt ' chunk of the DSF file */
|
||||
@ -126,13 +127,13 @@ dsf_read_metadata(struct decoder *decoder, struct input_stream *is,
|
||||
return false;
|
||||
|
||||
uint64_t fmt_chunk_size;
|
||||
fmt_chunk_size = (((uint64_t)GUINT32_FROM_LE(dsf_fmt_chunk.size_high)) << 32) |
|
||||
((uint64_t)GUINT32_FROM_LE(dsf_fmt_chunk.size_low));
|
||||
fmt_chunk_size = (uint64_t(FromLE32(dsf_fmt_chunk.size_high)) << 32) |
|
||||
uint64_t(FromLE32(dsf_fmt_chunk.size_low));
|
||||
|
||||
if (fmt_chunk_size != sizeof(dsf_fmt_chunk))
|
||||
return false;
|
||||
|
||||
uint32_t samplefreq = (uint32_t)GUINT32_FROM_LE(dsf_fmt_chunk.sample_freq);
|
||||
uint32_t samplefreq = FromLE32(dsf_fmt_chunk.sample_freq);
|
||||
|
||||
/* for now, only support version 1 of the standard, DSD raw stereo
|
||||
files with a sample freq of 2822400 Hz */
|
||||
@ -143,7 +144,7 @@ dsf_read_metadata(struct decoder *decoder, struct input_stream *is,
|
||||
|| samplefreq != 2822400)
|
||||
return false;
|
||||
|
||||
uint32_t chblksize = (uint32_t)GUINT32_FROM_LE(dsf_fmt_chunk.block_size);
|
||||
uint32_t chblksize = FromLE32(dsf_fmt_chunk.block_size);
|
||||
/* according to the spec block size should always be 4096 */
|
||||
if (chblksize != 4096)
|
||||
return false;
|
||||
@ -158,8 +159,8 @@ dsf_read_metadata(struct decoder *decoder, struct input_stream *is,
|
||||
we use the actual data size as chunk size */
|
||||
|
||||
uint64_t data_size;
|
||||
data_size = (((uint64_t)GUINT32_FROM_LE(data_chunk.size_high)) << 32) |
|
||||
((uint64_t)GUINT32_FROM_LE(data_chunk.size_low));
|
||||
data_size = (uint64_t(FromLE32(data_chunk.size_high)) << 32) |
|
||||
uint64_t(FromLE32(data_chunk.size_low));
|
||||
data_size -= sizeof(data_chunk);
|
||||
|
||||
metadata->chunk_size = data_size;
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "util/Error.hxx"
|
||||
#include "util/UriUtil.hxx"
|
||||
#include "util/Macros.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
#include "CheckAudioFormat.hxx"
|
||||
#include "tag/TagHandler.hxx"
|
||||
#include "Log.hxx"
|
||||
@ -47,18 +48,10 @@
|
||||
#define ov_time_seek_page(VF, S) (ov_time_seek_page(VF, (S)*1000))
|
||||
#endif /* HAVE_TREMOR */
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
||||
#define VORBIS_BIG_ENDIAN true
|
||||
#else
|
||||
#define VORBIS_BIG_ENDIAN false
|
||||
#endif
|
||||
|
||||
struct vorbis_input_stream {
|
||||
struct decoder *decoder;
|
||||
|
||||
@ -248,7 +241,7 @@ vorbis_stream_decode(struct decoder *decoder,
|
||||
|
||||
#ifdef HAVE_TREMOR
|
||||
long nbytes = ov_read(&vf, buffer, sizeof(buffer),
|
||||
VORBIS_BIG_ENDIAN, 2, 1,
|
||||
IsBigEndian(), 2, 1,
|
||||
¤t_section);
|
||||
#else
|
||||
float **per_channel;
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "../DecoderAPI.hxx"
|
||||
#include "tag/TagHandler.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
#include <errno.h>
|
||||
@ -265,11 +266,9 @@ sidplay_file_decode(struct decoder *decoder, const char *path_fs)
|
||||
config.sidEmulation = &builder;
|
||||
config.sidModel = SID2_MODEL_CORRECT;
|
||||
config.sidSamples = true;
|
||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
||||
config.sampleFormat = SID2_LITTLE_SIGNED;
|
||||
#else
|
||||
config.sampleFormat = SID2_BIG_SIGNED;
|
||||
#endif
|
||||
config.sampleFormat = IsLittleEndian()
|
||||
? SID2_LITTLE_SIGNED
|
||||
: SID2_BIG_SIGNED;
|
||||
if (tune.isStereo()) {
|
||||
config.playback = sid2_stereo;
|
||||
channels = 2;
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "ConfigError.hxx"
|
||||
#include "util/Error.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
|
||||
#include <opus.h>
|
||||
#include <ogg/ogg.h>
|
||||
@ -338,9 +339,9 @@ opus_encoder_generate_head(struct opus_encoder *encoder)
|
||||
memcpy(header, "OpusHead", 8);
|
||||
header[8] = 1;
|
||||
header[9] = encoder->audio_format.channels;
|
||||
*(uint16_t *)(header + 10) = GUINT16_TO_LE(encoder->lookahead);
|
||||
*(uint16_t *)(header + 10) = ToLE16(encoder->lookahead);
|
||||
*(uint32_t *)(header + 12) =
|
||||
GUINT32_TO_LE(encoder->audio_format.sample_rate);
|
||||
ToLE32(encoder->audio_format.sample_rate);
|
||||
header[16] = 0;
|
||||
header[17] = 0;
|
||||
header[18] = 0;
|
||||
@ -365,9 +366,9 @@ opus_encoder_generate_tags(struct opus_encoder *encoder)
|
||||
size_t comments_size = 8 + 4 + version_length + 4;
|
||||
unsigned char *comments = (unsigned char *)g_malloc(comments_size);
|
||||
memcpy(comments, "OpusTags", 8);
|
||||
*(uint32_t *)(comments + 8) = GUINT32_TO_LE(version_length);
|
||||
*(uint32_t *)(comments + 8) = ToLE32(version_length);
|
||||
memcpy(comments + 12, version, version_length);
|
||||
*(uint32_t *)(comments + 12 + version_length) = GUINT32_TO_LE(0);
|
||||
*(uint32_t *)(comments + 12 + version_length) = ToLE32(0);
|
||||
|
||||
ogg_packet packet;
|
||||
packet.packet = comments;
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "config.h"
|
||||
#include "WaveEncoderPlugin.hxx"
|
||||
#include "EncoderAPI.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
#include "util/fifo_buffer.h"
|
||||
extern "C" {
|
||||
#include "util/growing_fifo.h"
|
||||
@ -62,24 +63,23 @@ fill_wave_header(struct wave_header *header, int channels, int bits,
|
||||
int data_size = 0x0FFFFFFF;
|
||||
|
||||
/* constants */
|
||||
header->id_riff = GUINT32_TO_LE(0x46464952);
|
||||
header->id_wave = GUINT32_TO_LE(0x45564157);
|
||||
header->id_fmt = GUINT32_TO_LE(0x20746d66);
|
||||
header->id_data = GUINT32_TO_LE(0x61746164);
|
||||
header->id_riff = ToLE32(0x46464952);
|
||||
header->id_wave = ToLE32(0x45564157);
|
||||
header->id_fmt = ToLE32(0x20746d66);
|
||||
header->id_data = ToLE32(0x61746164);
|
||||
|
||||
/* wave format */
|
||||
header->format = GUINT16_TO_LE(1); // PCM_FORMAT
|
||||
header->channels = GUINT16_TO_LE(channels);
|
||||
header->bits = GUINT16_TO_LE(bits);
|
||||
header->freq = GUINT32_TO_LE(freq);
|
||||
header->blocksize = GUINT16_TO_LE(block_size);
|
||||
header->byterate = GUINT32_TO_LE(freq * block_size);
|
||||
header->format = ToLE16(1); // PCM_FORMAT
|
||||
header->channels = ToLE16(channels);
|
||||
header->bits = ToLE16(bits);
|
||||
header->freq = ToLE32(freq);
|
||||
header->blocksize = ToLE16(block_size);
|
||||
header->byterate = ToLE32(freq * block_size);
|
||||
|
||||
/* chunk sizes (fake data length) */
|
||||
header->fmt_size = GUINT32_TO_LE(16);
|
||||
header->data_size = GUINT32_TO_LE(data_size);
|
||||
header->riff_size = GUINT32_TO_LE(4 + (8 + 16) +
|
||||
(8 + data_size));
|
||||
header->fmt_size = ToLE32(16);
|
||||
header->data_size = ToLE32(data_size);
|
||||
header->riff_size = ToLE32(4 + (8 + 16) + (8 + data_size));
|
||||
}
|
||||
|
||||
static Encoder *
|
||||
@ -153,29 +153,29 @@ wave_encoder_close(Encoder *_encoder)
|
||||
fifo_buffer_free(encoder->buffer);
|
||||
}
|
||||
|
||||
static inline size_t
|
||||
static size_t
|
||||
pcm16_to_wave(uint16_t *dst16, const uint16_t *src16, size_t length)
|
||||
{
|
||||
size_t cnt = length >> 1;
|
||||
while (cnt > 0) {
|
||||
*dst16++ = GUINT16_TO_LE(*src16++);
|
||||
*dst16++ = ToLE16(*src16++);
|
||||
cnt--;
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
static inline size_t
|
||||
static size_t
|
||||
pcm32_to_wave(uint32_t *dst32, const uint32_t *src32, size_t length)
|
||||
{
|
||||
size_t cnt = length >> 2;
|
||||
while (cnt > 0){
|
||||
*dst32++ = GUINT32_TO_LE(*src32++);
|
||||
*dst32++ = ToLE32(*src32++);
|
||||
cnt--;
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
static inline size_t
|
||||
static size_t
|
||||
pcm24_to_wave(uint8_t *dst8, const uint32_t *src32, size_t length)
|
||||
{
|
||||
uint32_t value;
|
||||
@ -202,35 +202,35 @@ wave_encoder_write(Encoder *_encoder,
|
||||
|
||||
uint8_t *dst = (uint8_t *)growing_fifo_write(&encoder->buffer, length);
|
||||
|
||||
#if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
|
||||
switch (encoder->bits) {
|
||||
case 8:
|
||||
case 16:
|
||||
case 32:// optimized cases
|
||||
memcpy(dst, src, length);
|
||||
break;
|
||||
case 24:
|
||||
length = pcm24_to_wave(dst, (const uint32_t *)src, length);
|
||||
break;
|
||||
if (IsLittleEndian()) {
|
||||
switch (encoder->bits) {
|
||||
case 8:
|
||||
case 16:
|
||||
case 32:// optimized cases
|
||||
memcpy(dst, src, length);
|
||||
break;
|
||||
case 24:
|
||||
length = pcm24_to_wave(dst, (const uint32_t *)src, length);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (encoder->bits) {
|
||||
case 8:
|
||||
memcpy(dst, src, length);
|
||||
break;
|
||||
case 16:
|
||||
length = pcm16_to_wave((uint16_t *)dst,
|
||||
(const uint16_t *)src, length);
|
||||
break;
|
||||
case 24:
|
||||
length = pcm24_to_wave(dst, (const uint32_t *)src, length);
|
||||
break;
|
||||
case 32:
|
||||
length = pcm32_to_wave((uint32_t *)dst,
|
||||
(const uint32_t *)src, length);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#elif (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||
switch (encoder->bits) {
|
||||
case 8:
|
||||
memcpy(dst, src, length);
|
||||
break;
|
||||
case 16:
|
||||
length = pcm16_to_wave(dst, (const uint16_t *)src, length);
|
||||
break;
|
||||
case 24:
|
||||
length = pcm24_to_wave(dst, (const uint32_t *)src, length);
|
||||
break;
|
||||
case 32:
|
||||
length = pcm32_to_wave(dst, (const uint32_t *)src, length);
|
||||
break;
|
||||
}
|
||||
#else
|
||||
#error G_BYTE_ORDER set to G_PDP_ENDIAN is not supported by wave_encoder
|
||||
#endif
|
||||
|
||||
fifo_buffer_append(encoder->buffer, length);
|
||||
return true;
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "InputPlugin.hxx"
|
||||
#include "util/Error.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
#include <stdio.h>
|
||||
@ -202,12 +203,12 @@ input_cdio_open(const char *uri,
|
||||
|
||||
case 0:
|
||||
LogDebug(cdio_domain, "drive returns audio data Little Endian");
|
||||
reverse_endian = G_BYTE_ORDER == G_BIG_ENDIAN;
|
||||
reverse_endian = IsBigEndian();
|
||||
break;
|
||||
|
||||
case 1:
|
||||
LogDebug(cdio_domain, "drive returns audio data Big Endian");
|
||||
reverse_endian = G_BYTE_ORDER == G_LITTLE_ENDIAN;
|
||||
reverse_endian = IsLittleEndian();
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -25,9 +25,9 @@
|
||||
#include "util/Domain.hxx"
|
||||
#include "thread/Mutex.hxx"
|
||||
#include "thread/Cond.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
#include <glib.h>
|
||||
#include <CoreAudio/AudioHardware.h>
|
||||
#include <AudioUnit/AudioUnit.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
@ -342,9 +342,8 @@ osx_output_open(struct audio_output *ao, AudioFormat &audio_format,
|
||||
break;
|
||||
}
|
||||
|
||||
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
||||
stream_description.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
|
||||
#endif
|
||||
if (IsBigEndian())
|
||||
stream_description.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
|
||||
|
||||
stream_description.mBytesPerPacket = audio_format.GetFrameSize();
|
||||
stream_description.mFramesPerPacket = 1;
|
||||
|
@ -25,10 +25,9 @@
|
||||
#include "util/Error.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "util/Macros.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <fcntl.h>
|
||||
@ -532,7 +531,7 @@ oss_probe_sample_format(int fd, SampleFormat sample_format,
|
||||
pcm_export.Open(sample_format, 0, false, false,
|
||||
oss_format == AFMT_S24_PACKED,
|
||||
oss_format == AFMT_S24_PACKED &&
|
||||
G_BYTE_ORDER != G_LITTLE_ENDIAN);
|
||||
!IsLittleEndian());
|
||||
#endif
|
||||
|
||||
return SUCCESS;
|
||||
|
@ -18,15 +18,14 @@
|
||||
*/
|
||||
|
||||
#include "PcmPack.hxx"
|
||||
|
||||
#include <glib.h>
|
||||
#include "system/ByteOrder.hxx"
|
||||
|
||||
static void
|
||||
pack_sample(uint8_t *dest, const int32_t *src0)
|
||||
{
|
||||
const uint8_t *src = (const uint8_t *)src0;
|
||||
|
||||
if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||
if (IsBigEndian())
|
||||
++src;
|
||||
|
||||
*dest++ = *src++;
|
||||
@ -51,7 +50,7 @@ unpack_sample(int32_t *dest0, const uint8_t *src)
|
||||
{
|
||||
uint8_t *dest = (uint8_t *)dest0;
|
||||
|
||||
if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||
if (IsBigEndian())
|
||||
/* extend the sign bit to the most fourth byte */
|
||||
*dest++ = *src & 0x80 ? 0xff : 0x00;
|
||||
|
||||
@ -59,7 +58,7 @@ unpack_sample(int32_t *dest0, const uint8_t *src)
|
||||
*dest++ = *src++;
|
||||
*dest++ = *src;
|
||||
|
||||
if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
|
||||
if (IsLittleEndian())
|
||||
/* extend the sign bit to the most fourth byte */
|
||||
*dest++ = *src & 0x80 ? 0xff : 0x00;
|
||||
}
|
||||
|
183
src/system/ByteOrder.hxx
Normal file
183
src/system/ByteOrder.hxx
Normal file
@ -0,0 +1,183 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2013 Max Kellermann <max@duempel.org>,
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef BYTE_ORDER_HXX
|
||||
#define BYTE_ORDER_HXX
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#if defined(__i386__) || defined(__x86_64__) || defined(__ARMEL__)
|
||||
#define IS_LITTLE_ENDIAN true
|
||||
#define IS_BIG_ENDIAN false
|
||||
#else
|
||||
#define IS_LITTLE_ENDIAN true
|
||||
#define IS_BIG_ENDIAN false;
|
||||
#endif
|
||||
|
||||
static inline constexpr bool
|
||||
IsLittleEndian()
|
||||
{
|
||||
return IS_LITTLE_ENDIAN;
|
||||
}
|
||||
|
||||
static inline constexpr bool
|
||||
IsBigEndian()
|
||||
{
|
||||
return IS_BIG_ENDIAN;
|
||||
}
|
||||
|
||||
static inline constexpr uint16_t
|
||||
ByteSwap16(uint16_t value)
|
||||
{
|
||||
return (value >> 8) | (value << 8);
|
||||
}
|
||||
|
||||
static inline constexpr uint32_t
|
||||
ByteSwap32(uint32_t value)
|
||||
{
|
||||
return (value >> 24) | ((value >> 8) & 0x0000ff00) |
|
||||
((value << 8) & 0x00ff0000) | (value << 24);
|
||||
}
|
||||
|
||||
static inline constexpr uint64_t
|
||||
ByteSwap64(uint64_t value)
|
||||
{
|
||||
return uint64_t(ByteSwap32(uint32_t(value >> 32)))
|
||||
| (uint64_t(ByteSwap32(value)) << 32);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 16bit value from big endian to the system's byte order
|
||||
*/
|
||||
static inline constexpr uint16_t
|
||||
FromBE16(uint16_t value)
|
||||
{
|
||||
return IsBigEndian() ? value : ByteSwap16(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 32bit value from big endian to the system's byte order
|
||||
*/
|
||||
static inline constexpr uint32_t
|
||||
FromBE32(uint32_t value)
|
||||
{
|
||||
return IsBigEndian() ? value : ByteSwap32(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 64bit value from big endian to the system's byte order
|
||||
*/
|
||||
static inline constexpr uint64_t
|
||||
FromBE64(uint64_t value)
|
||||
{
|
||||
return IsBigEndian() ? value : ByteSwap64(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 16bit value from little endian to the system's byte order
|
||||
*/
|
||||
static inline constexpr uint16_t
|
||||
FromLE16(uint16_t value)
|
||||
{
|
||||
return IsLittleEndian() ? value : ByteSwap16(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 32bit value from little endian to the system's byte order
|
||||
*/
|
||||
static inline constexpr uint32_t
|
||||
FromLE32(uint32_t value)
|
||||
{
|
||||
return IsLittleEndian() ? value : ByteSwap32(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 64bit value from little endian to the system's byte order
|
||||
*/
|
||||
static inline constexpr uint64_t
|
||||
FromLE64(uint64_t value)
|
||||
{
|
||||
return IsLittleEndian() ? value : ByteSwap64(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 16bit value from the system's byte order to big endian
|
||||
*/
|
||||
static inline constexpr uint16_t
|
||||
ToBE16(uint16_t value)
|
||||
{
|
||||
return IsBigEndian() ? value : ByteSwap16(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 32bit value from the system's byte order to big endian
|
||||
*/
|
||||
static inline constexpr uint32_t
|
||||
ToBE32(uint32_t value)
|
||||
{
|
||||
return IsBigEndian() ? value : ByteSwap32(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 64bit value from the system's byte order to big endian
|
||||
*/
|
||||
static inline constexpr uint64_t
|
||||
ToBE64(uint64_t value)
|
||||
{
|
||||
return IsBigEndian() ? value : ByteSwap64(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 16bit value from the system's byte order to little endian
|
||||
*/
|
||||
static inline constexpr uint16_t
|
||||
ToLE16(uint16_t value)
|
||||
{
|
||||
return IsLittleEndian() ? value : ByteSwap16(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 32bit value from the system's byte order to little endian
|
||||
*/
|
||||
static inline constexpr uint32_t
|
||||
ToLE32(uint32_t value)
|
||||
{
|
||||
return IsLittleEndian() ? value : ByteSwap32(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a 64bit value from the system's byte order to little endian
|
||||
*/
|
||||
static inline constexpr uint64_t
|
||||
ToLE64(uint64_t value)
|
||||
{
|
||||
return IsLittleEndian() ? value : ByteSwap64(value);
|
||||
}
|
||||
|
||||
#endif
|
@ -20,6 +20,7 @@
|
||||
#include "config.h" /* must be first for large file support */
|
||||
#include "Aiff.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
#include <glib.h>
|
||||
@ -65,7 +66,7 @@ aiff_seek_id3(FILE *file)
|
||||
size_t size = fread(&header, sizeof(header), 1, file);
|
||||
if (size != 1 ||
|
||||
memcmp(header.id, "FORM", 4) != 0 ||
|
||||
GUINT32_FROM_BE(header.size) > (uint32_t)st.st_size ||
|
||||
FromBE32(header.size) > (uint32_t)st.st_size ||
|
||||
(memcmp(header.format, "AIFF", 4) != 0 &&
|
||||
memcmp(header.format, "AIFC", 4) != 0))
|
||||
/* not a AIFF file */
|
||||
@ -79,7 +80,7 @@ aiff_seek_id3(FILE *file)
|
||||
if (size != 1)
|
||||
return 0;
|
||||
|
||||
size = GUINT32_FROM_BE(chunk.size);
|
||||
size = FromBE32(chunk.size);
|
||||
if (size > G_MAXINT32)
|
||||
/* too dangerous, bail out: possible integer
|
||||
underflow when casting to off_t */
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
#include "config.h"
|
||||
#include "ApeLoader.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
@ -44,11 +45,11 @@ ape_scan_internal(FILE *fp, ApeTagCallback callback)
|
||||
if (fseek(fp, -(long)sizeof(footer), SEEK_END) ||
|
||||
fread(&footer, 1, sizeof(footer), fp) != sizeof(footer) ||
|
||||
memcmp(footer.id, "APETAGEX", sizeof(footer.id)) != 0 ||
|
||||
GUINT32_FROM_LE(footer.version) != 2000)
|
||||
FromLE32(footer.version) != 2000)
|
||||
return false;
|
||||
|
||||
/* find beginning of ape tag */
|
||||
size_t remaining = GUINT32_FROM_LE(footer.length);
|
||||
size_t remaining = FromLE32(footer.length);
|
||||
if (remaining <= sizeof(footer) + 10 ||
|
||||
/* refuse to load more than one megabyte of tag data */
|
||||
remaining > 1024 * 1024 ||
|
||||
@ -66,13 +67,13 @@ ape_scan_internal(FILE *fp, ApeTagCallback callback)
|
||||
}
|
||||
|
||||
/* read tags */
|
||||
unsigned n = GUINT32_FROM_LE(footer.count);
|
||||
unsigned n = FromLE32(footer.count);
|
||||
const char *p = buffer;
|
||||
while (n-- && remaining > 10) {
|
||||
size_t size = GUINT32_FROM_LE(*(const uint32_t *)p);
|
||||
size_t size = FromLE32(*(const uint32_t *)p);
|
||||
p += 4;
|
||||
remaining -= 4;
|
||||
unsigned long flags = GUINT32_FROM_LE(*(const uint32_t *)p);
|
||||
unsigned long flags = FromLE32(*(const uint32_t *)p);
|
||||
p += 4;
|
||||
remaining -= 4;
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "config.h" /* must be first for large file support */
|
||||
#include "Riff.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
#include <glib.h>
|
||||
@ -65,7 +66,7 @@ riff_seek_id3(FILE *file)
|
||||
size_t size = fread(&header, sizeof(header), 1, file);
|
||||
if (size != 1 ||
|
||||
memcmp(header.id, "RIFF", 4) != 0 ||
|
||||
GUINT32_FROM_LE(header.size) > (uint32_t)st.st_size)
|
||||
FromLE32(header.size) > (uint32_t)st.st_size)
|
||||
/* not a RIFF file */
|
||||
return 0;
|
||||
|
||||
@ -77,7 +78,7 @@ riff_seek_id3(FILE *file)
|
||||
if (size != 1)
|
||||
return 0;
|
||||
|
||||
size = GUINT32_FROM_LE(chunk.size);
|
||||
size = FromLE32(chunk.size);
|
||||
if (size > G_MAXINT32)
|
||||
/* too dangerous, bail out: possible integer
|
||||
underflow when casting to off_t */
|
||||
|
@ -18,9 +18,9 @@
|
||||
*/
|
||||
|
||||
#include "ByteReverse.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
#include "Compiler.h"
|
||||
|
||||
#include <glib.h>
|
||||
#include <assert.h>
|
||||
|
||||
void
|
||||
@ -33,7 +33,7 @@ reverse_bytes_16(uint16_t *gcc_restrict dest,
|
||||
|
||||
while (src < src_end) {
|
||||
const uint16_t x = *src++;
|
||||
*dest++ = GUINT16_SWAP_LE_BE(x);
|
||||
*dest++ = ByteSwap16(x);
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,7 +47,7 @@ reverse_bytes_32(uint32_t *gcc_restrict dest,
|
||||
|
||||
while (src < src_end) {
|
||||
const uint32_t x = *src++;
|
||||
*dest++ = GUINT32_SWAP_LE_BE(x);
|
||||
*dest++ = ByteSwap32(x);
|
||||
}
|
||||
}
|
||||
|
||||
@ -61,7 +61,7 @@ reverse_bytes_64(uint64_t *gcc_restrict dest,
|
||||
|
||||
while (src < src_end) {
|
||||
const uint64_t x = *src++;
|
||||
*dest++ = GUINT64_SWAP_LE_BE(x);
|
||||
*dest++ = ByteSwap64(x);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "test_pcm_all.hxx"
|
||||
#include "test_pcm_util.hxx"
|
||||
#include "pcm/PcmPack.hxx"
|
||||
#include "system/ByteOrder.hxx"
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
@ -34,7 +35,7 @@ test_pcm_pack_24()
|
||||
|
||||
for (unsigned i = 0; i < N; ++i) {
|
||||
int32_t d;
|
||||
if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||
if (IsBigEndian())
|
||||
d = (dest[i * 3] << 16) | (dest[i * 3 + 1] << 8)
|
||||
| dest[i * 3 + 2];
|
||||
else
|
||||
@ -58,7 +59,7 @@ test_pcm_unpack_24()
|
||||
|
||||
for (unsigned i = 0; i < N; ++i) {
|
||||
int32_t s;
|
||||
if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||
if (IsBigEndian())
|
||||
s = (src[i * 3] << 16) | (src[i * 3 + 1] << 8)
|
||||
| src[i * 3 + 2];
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user