Use the new lsx_parseposition function for the delay effect and update the documentation accordingly.
Showing the changes to src/delay.c (1 of 2 files). Show all
Unified · Split
| @@ -43,7 +43,6 @@ static int lsx_kill(sox_effect_t * effp) · 42 unmodified lines | ||
| 43 | 43 | static int create(sox_effect_t * effp, int argc, char * * argv) |
| 44 | 44 | { |
| 45 | 45 | priv_t * p = (priv_t *)effp->priv; |
| 46 | − uint64_t dummy; | |
| 47 | 46 | unsigned i; |
| 48 | 47 | |
| 49 | 48 | --argc, ++argv; |
| @@ -51,7 +50,7 @@ static int create(sox_effect_t * effp, int argc, char * * argv) · 1 unmodified line | ||
| 51 | 50 | p->args = lsx_calloc(p->argc, sizeof(*p->args)); |
| 52 | 51 | p->max_delay = lsx_malloc(sizeof(*p->max_delay)); |
| 53 | 52 | for (i = 0; i < p->argc; ++i) { |
| 54 | − char const * next = lsx_parsesamples(1e5, p->args[i].str = lsx_strdup(argv[i]), &dummy, 't'); | |
| 53 | + char const * next = lsx_parseposition(0., p->args[i].str = lsx_strdup(argv[i]), NULL, (uint64_t)0, (uint64_t)0, '='); | |
| 55 | 54 | if (!next || *next) { |
| 56 | 55 | lsx_kill(effp); |
| 57 | 56 | return lsx_usage(effp); |
| @@ -70,7 +69,9 @@ static int stop(sox_effect_t * effp) · 12 unmodified lines | ||
| 70 | 69 | static int start(sox_effect_t * effp) |
| 71 | 70 | { |
| 72 | 71 | priv_t * p = (priv_t *)effp->priv; |
| 73 | − uint64_t max_delay = 0, delay; | |
| 72 | + uint64_t max_delay = 0, last_seen = 0, delay; | |
| 73 | + uint64_t in_length = effp->in_signal.length != SOX_UNKNOWN_LEN ? | |
| 74 | + effp->in_signal.length / effp->in_signal.channels : SOX_UNKNOWN_LEN; | |
| 74 | 75 | |
| 75 | 76 | if (effp->flow == 0) { |
| 76 | 77 | unsigned i; |
| @@ -79,8 +80,11 @@ static int start(sox_effect_t * effp) · 2 unmodified lines | ||
| 79 | 80 | return SOX_EOF; |
| 80 | 81 | } |
| 81 | 82 | for (i = 0; i < p->argc; ++i) { |
| 82 | − lsx_parsesamples(effp->in_signal.rate, p->args[i].str, &delay, 't'); | |
| 83 | − p->args[i].delay = delay; | |
| 83 | + if (!lsx_parseposition(effp->in_signal.rate, p->args[i].str, &delay, last_seen, in_length, '=') || delay == SOX_UNKNOWN_LEN) { | |
| 84 | + lsx_fail("Position relative to end of audio specified, but audio length is unknown"); | |
| 85 | + return SOX_EOF; | |
| 86 | + } | |
| 87 | + p->args[i].delay = last_seen = delay; | |
| 84 | 88 | if (delay > max_delay) { |
| 85 | 89 | max_delay = delay; |
| 86 | 90 | } |
| @@ -152,7 +156,7 @@ static int drain(sox_effect_t * effp, sox_sample_t * obuf, size_t * osamp) · 65 unmodified lines | ||
| 152 | 156 | sox_effect_handler_t const * lsx_delay_effect_fn(void) |
| 153 | 157 | { |
| 154 | 158 | static sox_effect_handler_t handler = { |
| 155 | − "delay", "{length}", SOX_EFF_LENGTH | SOX_EFF_MODIFY, | |
| 159 | + "delay", "{position}", SOX_EFF_LENGTH | SOX_EFF_MODIFY, | |
| 156 | 160 | create, start, flow, drain, stop, lsx_kill, sizeof(priv_t) |
| 157 | 161 | }; |
| 158 | 162 | return &handler; |