#if (G_BYTE_ORDER == G_LITTLE_ENDIAN) #define get_unaligned_u24(_x) ( (((guint8*)_x)[0]) | ((((guint8*)_x)[1]) << 8) | ((((guint8*)_x)[2]) << 16) ) #define write_unaligned_u24(_x,samp) do { *(_x)++ = samp & 0xFF; *(_x)++ = (samp >> 8) & 0xFF; *(_x)++ = (samp >> 16) & 0xFF; } while (0) #else /* BIG ENDIAN */ #define get_unaligned_u24(_x) ( (((guint8*)_x)[2]) | ((((guint8*)_x)[1]) << 8) | ((((guint8*)_x)[0]) << 16) ) #define write_unaligned_u24(_x,samp) do { *(_x)++ = (samp >> 16) & 0xFF; *(_x)++ = (samp >> 8) & 0xFF; *(_x)++ = samp & 0xFF; } while (0) #endif static void volume_process_int24 (GstVolume * this, gpointer bytes, guint n_bytes) { gint8 *data = (gint8 *) bytes; /* treat the data as a byte stream */ guint i, num_samples; guint32 samp; gint64 val; num_samples = n_bytes / (sizeof (gint8) * 3); for (i = 0; i < num_samples; i++) { samp = get_unaligned_u24 (data); if (samp & 0x800000) samp |= 0xFF000000; /* make signed */ val = (gint32) samp; val = (((gint64) this->real_vol_i24 * val) >> VOLUME_UNITY_INT24_BIT_SHIFT); samp = (guint32) val; /* write the value back into the stream */ // *data++ = samp & 0xFF; *data++ = (samp >> 8) & 0xFF; *data++ = (samp >> 16) & 0xFF; write_unaligned_u24 (data, samp); } }