diff --git a/common.h b/common.h index 72e2758c..01ce9de0 100644 --- a/common.h +++ b/common.h @@ -2,6 +2,7 @@ #define _COMMON_H #include +#include #include #include @@ -116,6 +117,7 @@ uint64_t get_absolute_time_in_fp(void); // this is for reading an unsigned 32 bit number, such as an RTP timestamp +long endianness; uint32_t uatoi(const char *nptr); shairport_cfg config; diff --git a/player.c b/player.c index ed525d79..de2a980f 100644 --- a/player.c +++ b/player.c @@ -384,9 +384,9 @@ int32_t rand_in_range(int32_t exclusive_range_limit) { } static inline short dithered_vol(short sample) { - int32_t out; + long out; - out = (int32_t)sample * fix_volume; + out = (long)sample * fix_volume; if (fix_volume < 0x10000) { // add a TPDF dither -- see http://www.users.qwest.net/%7Evolt42/cadenzarecording/DitherExplained.pdf @@ -398,7 +398,7 @@ static inline short dithered_vol(short sample) { // See the original paper at http://www.ece.rochester.edu/courses/ECE472/resources/Papers/Lipshitz_1992.pdf // by Lipshitz, Wannamaker and Vanderkooy, 1992. - int32_t tpdf = rand_in_range(65536+1) - rand_in_range(65536+1); + long tpdf = rand_in_range(65536+1) - rand_in_range(65536+1); // Check there's no clipping -- if there is, if (tpdf>=0) { if (LONG_MAX-tpdf>=out) @@ -415,35 +415,6 @@ static inline short dithered_vol(short sample) { return out >> 16; } - -/* -static inline short lcg_rand(void) { - static unsigned long lcg_prev = 12345; - lcg_prev = lcg_prev * 69069 + 3; - return lcg_prev & 0xffff; -} - - -static inline short dithered_vol(short sample) { - static short rand_a; - short rand_b; - long out; - - out = (long)sample * fix_volume; - if (fix_volume < 0x10000) { - // add a TPDF dither -- see http://www.users.qwest.net/%7Evolt42/cadenzarecording/DitherExplained.pdf - // and the discussion around https://www.hydrogenaud.io/forums/index.php?showtopic=16963&st=25 - // I think it's wrong. I think, for a 32 --> 16 bits, the range of - // random numbers needs to be from 0 to 2^16, i.e. from 0 to 65536, not from -32768bto +32767 - rand_b = rand_a; - rand_a = lcg_rand(); - out += rand_a; - out -= rand_b; - } - return out >> 16; -} -*/ - // get the next frame, when available. return 0 if underrun/stream reset. static abuf_t *buffer_get_frame(void) { int16_t buf_fill; diff --git a/shairport.c b/shairport.c index 93be47e2..20fce74b 100644 --- a/shairport.c +++ b/shairport.c @@ -641,6 +641,27 @@ int main(int argc, char **argv) { free(basec); // set defaults + + + // get thje endianness + union { + uint32_t u32; + uint8_t arr[4]; + } xn; + + xn.arr[0] = 0x44; /* Lowest-address byte */ + xn.arr[1] = 0x33; + xn.arr[2] = 0x22; + xn.arr[3] = 0x11; /* Highest-address byte */ + + if (xn.u32==0x11223344) + endianness = __LITTLE_ENDIAN; + else if (xn.u32==0x33441122) + endianness = __PDP_ENDIAN; + else if (xn.u32==0x44332211) + endianness = __BIG_ENDIAN; + else die("Can not recognise the endianness of the processor."); + strcpy(configuration_file_path, "/etc/"); strcat(configuration_file_path, appName); strcat(configuration_file_path, ".conf"); @@ -832,6 +853,18 @@ int main(int argc, char **argv) { daemon_log(LOG_NOTICE, "startup"); + switch (endianness) { + case __LITTLE_ENDIAN: + debug(2,"The processor is running little-endian."); + break; + case __BIG_ENDIAN: + debug(2,"The processor is running big-endian."); + break; + case __PDP_ENDIAN: + debug(2,"The processor is running pdp-endian."); + break; + } + /* Mess around with the latency options */ // Basically, we used to rely on static latencies -- 99400 for iTunes 10 or later and forkedDaapd, 88200 for everything else // Nowadays we allow the source to set the latency, which works out at 99651 for iTunes 10 and forkedDaapd and 88220 for everything else