Skip to content

File delay_core.h

File List > delay > delay_core.h

Go to the documentation of this file

#ifndef DP_DELAY_CORE_H
#define DP_DELAY_CORE_H

#include "doppler/clib_common.h"
#include "doppler/jm_perf.h"
#include "doppler/dp_state.h"
#ifdef __cplusplus
extern "C"
{
#endif

  typedef struct
  {
    double _Complex *buf; /* 2*capacity elements; second half mirrors first */
    size_t head;          /* write pointer; decrements mod capacity */
    size_t mask;          /* capacity - 1 (power-of-two bitmask) */
    size_t num_taps;      /* window length requested at construction */
    size_t capacity;      /* smallest power-of-two >= num_taps */
  } dp_delay_state_t;

dp_delay_state_t *dp_delay_create(size_t num_taps);

void dp_delay_destroy(dp_delay_state_t *state);

void dp_delay_reset(dp_delay_state_t *state);

void dp_delay_push(dp_delay_state_t *state, double _Complex x);

size_t dp_delay_ptr_max_out(dp_delay_state_t *state, size_t n);

size_t dp_delay_ptr(dp_delay_state_t *state, size_t n, double _Complex *out, size_t max_out);

size_t dp_delay_push_ptr_max_out(dp_delay_state_t *state);

size_t dp_delay_push_ptr(dp_delay_state_t *state, double _Complex x,
                      double _Complex *out, size_t max_out);

void dp_delay_write(dp_delay_state_t *state, double _Complex x);

/* ── Serializable state (standard bytes interface; see dp_state.h) ──────────
 * Field-wise: pack running ring buffer + head; capacity/mask/num_taps restored by create. */
#define DELAY_STATE_MAGIC DP_FOURCC ('D','L','A','Y')
#define DELAY_STATE_VERSION 1u
size_t dp_delay_state_bytes (const dp_delay_state_t *state);
void dp_delay_get_state (const dp_delay_state_t *state, void *blob);
int dp_delay_set_state (dp_delay_state_t *state, const void *blob);

#ifdef __cplusplus
}
#endif

#endif /* DELAY_CORE_H */