X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=wav_filter.c;h=3c69311f570209cec4bed6abe27036d6d5754853;hp=3fce556d5d1ecb514b0cffeec869103ff0bec178;hb=df6606e438a34c7bfc325e5f320843d1e97d3f7a;hpb=d9e608504d9d0e71380907559546e211c4f0ce55 diff --git a/wav_filter.c b/wav_filter.c index 3fce556d..3c69311f 100644 --- a/wav_filter.c +++ b/wav_filter.c @@ -1,15 +1,18 @@ /* - * Copyright (C) 2005-2008 Andre Noll + * Copyright (C) 2005-2009 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ /** \file wav_filter.c A filter that inserts a wave header. */ -#include "para.h" +#include +#include "para.h" +#include "error.h" #include "list.h" #include "sched.h" +#include "ggo.h" #include "filter.h" #include "string.h" #include "portable_io.h" @@ -30,22 +33,21 @@ static void make_wav_header(unsigned int channels, unsigned int samplerate, int bytespersec = channels * samplerate * BITS / 8; int align = channels * BITS / 8; - assert(channels); PARA_DEBUG_LOG("writing wave header: %d channels, %d KHz\n", channels, samplerate); memset(headbuf, 0, WAV_HEADER_LEN); memcpy(headbuf, "RIFF", 4); write_u32(headbuf + 4, size - 8); memcpy(headbuf + 8, "WAVE", 4); memcpy(headbuf + 12, "fmt ", 4); - write_u32(headbuf + 16, 16); - write_u16(headbuf + 20, 1); /* format */ + write_u32(headbuf + 16, 16); /* 16 + extra format bytes (zero) */ + write_u16(headbuf + 20, 1); /* format (1 == PCM/uncompressed) */ write_u16(headbuf + 22, channels); write_u32(headbuf + 24, samplerate); write_u32(headbuf + 28, bytespersec); - write_u16(headbuf + 32, align); - write_u16(headbuf + 34, BITS); - memcpy(headbuf + 36, "data", 4); - write_u32(headbuf + 40, size - 44); + write_u16(headbuf + 32, align); /* number of bytes per sample slice */ + write_u16(headbuf + 34, BITS); /* significant bits per sample */ + memcpy(headbuf + 36, "data", 4); /* chunk ID */ + write_u32(headbuf + 40, size - 44); /* chunk size */ } static ssize_t wav_convert(char *inbuf, size_t len, struct filter_node *fn) @@ -56,6 +58,10 @@ static ssize_t wav_convert(char *inbuf, size_t len, struct filter_node *fn) if (*bof) { if (!len) return 0; + if (!fn->fc->channels || !fn->fc->samplerate) { + PARA_ERROR_LOG("%s\n", para_strerror(E_WAV_BAD_FC)); + return -E_WAV_BAD_FC; + } make_wav_header(fn->fc->channels, fn->fc->samplerate, fn); fn->loaded = WAV_HEADER_LEN; *bof = 0;