size_t size;
- if (conf.begin_chunk_arg < 0)
- return -ERRNO_TO_PARA_ERROR(EINVAL);
- first_chunk = conf.begin_chunk_arg;
-
- if (conf.end_chunk_given) {
- if (conf.end_chunk_arg < 0)
- return -ERRNO_TO_PARA_ERROR(EINVAL);
- if (conf.end_chunk_arg >= afhi->chunks_total)
+ if (conf.begin_chunk_arg < 0) {
+ if (-conf.begin_chunk_arg > afhi->chunks_total)
return -ERRNO_TO_PARA_ERROR(EINVAL);
- last_chunk = conf.end_chunk_arg;
+ first_chunk = afhi->chunks_total + conf.begin_chunk_arg;
+ } else
+ first_chunk = conf.begin_chunk_arg;
+ if (conf.end_chunk_given) {
+ if (conf.end_chunk_arg < 0) {
+ if (-conf.end_chunk_arg > afhi->chunks_total)
+ return -ERRNO_TO_PARA_ERROR(EINVAL);
+ last_chunk = afhi->chunks_total + conf.end_chunk_arg;
+ } else {
+ if (conf.end_chunk_arg >= afhi->chunks_total)
+ return -ERRNO_TO_PARA_ERROR(EINVAL);
+ last_chunk = conf.end_chunk_arg;
+ }
} else
last_chunk = afhi->chunks_total - 1;
+ if (first_chunk >= last_chunk)
+ return -ERRNO_TO_PARA_ERROR(EINVAL);
if (!afhi->chunks_total)
return 1;
afh_get_header(afhi, audio_file_data, &buf, &size);