Skip to content

Commit

Permalink
Apply Daphile DSD changes to master. DSD build option requires alsa l…
Browse files Browse the repository at this point in the history
…ibrary v1.0.29+.
  • Loading branch information
ralph-irving committed Apr 28, 2018
1 parent 94d6cea commit 234a8b3
Show file tree
Hide file tree
Showing 16 changed files with 607 additions and 104 deletions.
42 changes: 13 additions & 29 deletions dop.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,30 +30,30 @@ extern struct outputstate output;
#define LOCK_O mutex_lock(outputbuf->mutex)
#define UNLOCK_O mutex_unlock(outputbuf->mutex)

// check for 32 dop marker frames to see if this is dop in flac
// dop is always encoded in 24 bit samples with marker 0x0005xxxx or 0x00FAxxxx
bool is_flac_dop(u32_t *lptr, u32_t *rptr, frames_t frames) {
// check for 32 dop marker frames to see if this is a dop stream
// dop is always encoded in 24 bit samples with markers 0x05 or 0xFA in MSB
bool is_stream_dop(u8_t *lptr, u8_t *rptr, int step, frames_t frames) {
int matched = 0;
u32_t next = 0;

while (frames--) {
if (((*lptr & 0x00FF0000) == 0x00050000 && (*rptr & 0x00FF0000) == 0x00050000) ||
((*lptr & 0x00FF0000) == 0x00FA0000 && (*rptr & 0x00FF0000) == 0x00FA0000)) {
if (*lptr >> 24 == next) {
if ((*lptr == 0x05 && *rptr == 0x05) ||
(*lptr == 0xFA && *rptr == 0xFA)) {
if (*lptr == next) {
matched++;
next = ( 0x05 + 0xFA ) - next;
} else {
next = *lptr >> 24;
next = *lptr;
matched = 1;
}
next = ( 0x05 + 0xFA ) - next;
} else {
return false;
}
if (matched == 32) {
return true;
}

++lptr; ++rptr;
lptr+=step; rptr+=step;
}
return false;
}
Expand All @@ -65,38 +65,22 @@ void update_dop(u32_t *ptr, frames_t frames, bool invert) {
if (!invert) {
while (frames--) {
u32_t scaled_marker = marker << 24;
*ptr = (*ptr & 0x00FFFFFF) | scaled_marker;
*ptr = (*ptr & 0x00FFFF00) | scaled_marker;
++ptr;
*ptr = (*ptr & 0x00FFFFFF) | scaled_marker;
*ptr = (*ptr & 0x00FFFF00) | scaled_marker;
++ptr;
marker = ( 0x05 + 0xFA ) - marker;
}
} else {
while (frames--) {
u32_t scaled_marker = marker << 24;
*ptr = ((~(*ptr)) & 0x00FFFFFF) | scaled_marker;
*ptr = ((~(*ptr)) & 0x00FFFF00) | scaled_marker;
++ptr;
*ptr = ((~(*ptr)) & 0x00FFFFFF) | scaled_marker;
*ptr = ((~(*ptr)) & 0x00FFFF00) | scaled_marker;
++ptr;
marker = ( 0x05 + 0xFA ) - marker;
}
}
}

// fill silence buffer with 10101100 which represents dop silence
// leave marker zero it will be updated at output, leave lsb zero
void dop_silence_frames(u32_t *ptr, frames_t frames) {
while (frames--) {
*ptr++ = 0x00ACAC00;
*ptr++ = 0x00ACAC00;
}
}

void dop_init(bool enable, unsigned delay) {
LOCK_O;
output.has_dop = enable;
output.dop_delay = delay;
UNLOCK_O;
}

#endif // DSD
Loading

0 comments on commit 234a8b3

Please sign in to comment.