static void write_wav_header(int fd, int rate, int nchannels, int size){ wave_header_t header; memcpy(&header.riff_chunk.riff,"RIFF",4); header.riff_chunk.len=le_uint32(size+32); memcpy(&header.riff_chunk.wave,"WAVE",4); memcpy(&header.format_chunk.fmt,"fmt ",4); header.format_chunk.len=le_uint32(0x10); header.format_chunk.type=le_uint16(0x1); header.format_chunk.channel=le_uint16(nchannels); header.format_chunk.rate=le_uint32(rate); header.format_chunk.bps=le_uint32(rate*2*nchannels); header.format_chunk.blockalign=le_uint16(2*nchannels); header.format_chunk.bitpspl=le_uint16(16); memcpy(&header.data_chunk.data,"data",4); header.data_chunk.len=le_uint32(size); lseek(fd,0,SEEK_SET); if (write(fd,&header,sizeof(header))!=sizeof(header)){ ms_warning("Fail to write wav header."); } }
static void write_wav_header(int rate,int size, char *filename){ wave_header_t header; DWORD bytes_written=0; HANDLE fd; memcpy(&header.riff_chunk.riff,"RIFF",4); header.riff_chunk.len=le_uint32(size+32); memcpy(&header.riff_chunk.wave,"WAVE",4); memcpy(&header.format_chunk.fmt,"fmt ",4); header.format_chunk.len=le_uint32(0x10); header.format_chunk.type=le_uint16(0x1); header.format_chunk.channel=le_uint16(0x1); header.format_chunk.rate=le_uint32(rate); header.format_chunk.bps=le_uint32(rate*2); header.format_chunk.blockalign=le_uint16(2); header.format_chunk.bitpspl=le_uint16(16); memcpy(&header.data_chunk.data,"data",4); header.data_chunk.len=le_uint32(size); /* TODO: replace with "lseek" equivalent for windows */ fd=CreateFile(filename, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (fd==INVALID_HANDLE_VALUE){ #if !defined(_WIN32_WCE) ms_warning("Cannot open %s: %s",filename,strerror(errno)); #else ms_warning("Cannot open %s: %i",filename,WSAGetLastError()); #endif return; } WriteFile(fd,&header,sizeof(header), &bytes_written, NULL); if (bytes_written!=sizeof(header)){ ms_warning("Fail to write wav header."); } CloseHandle(fd); }
static int read_wav_header(PlayerData *d){ char header1[sizeof(riff_t)]; char header2[sizeof(format_t)]; char header3[sizeof(data_t)]; int count; riff_t *riff_chunk=(riff_t*)header1; format_t *format_chunk=(format_t*)header2; data_t *data_chunk=(data_t*)header3; unsigned long len=0; len = read(d->fd, header1, sizeof(header1)) ; if (len != sizeof(header1)){ goto not_a_wav; } if (0!=strncmp(riff_chunk->riff, "RIFF", 4) || 0!=strncmp(riff_chunk->wave, "WAVE", 4)){ goto not_a_wav; } len = read(d->fd, header2, sizeof(header2)) ; if (len != sizeof(header2)){ ms_warning("Wrong wav header: cannot read file"); goto not_a_wav; } d->rate=le_uint32(format_chunk->rate); d->nchannels=le_uint16(format_chunk->channel); if (format_chunk->len-0x10>0) { lseek(d->fd,(format_chunk->len-0x10),SEEK_CUR); } d->hsize=sizeof(wave_header_t)-0x10+format_chunk->len; len = read(d->fd, header3, sizeof(header3)) ; if (len != sizeof(header3)){ ms_warning("Wrong wav header: cannot read file"); goto not_a_wav; } count=0; while (strncmp(data_chunk->data, "data", 4)!=0 && count<30) { ms_warning("skipping chunk=%s len=%i", data_chunk->data, data_chunk->len); lseek(d->fd,data_chunk->len,SEEK_CUR); count++; d->hsize=d->hsize+len+data_chunk->len; len = read(d->fd, header3, sizeof(header3)) ; if (len != sizeof(header3)){ ms_warning("Wrong wav header: cannot read file"); goto not_a_wav; } } #ifdef WORDS_BIGENDIAN if (le_uint16(format_chunk->blockalign)==le_uint16(format_chunk->channel) * 2) d->swap=TRUE; #endif return 0; not_a_wav: /*rewind*/ lseek(d->fd,0,SEEK_SET); d->hsize=0; return -1; }
static int read_wav_header(PlayerData *d){ char header1[sizeof(riff_t)]; char header2[sizeof(format_t)]; char header3[sizeof(data_t)]; int count; riff_t *riff_chunk=(riff_t*)header1; format_t *format_chunk=(format_t*)header2; data_t *data_chunk=(data_t*)header3; unsigned long len=0; BOOL res; res = ReadFile(d->fd, header1, sizeof(header1), &len, NULL) ; if (!res || len != sizeof(header1)){ ms_warning("Wrong wav header: cannot read file"); return -1; } if (0!=strncmp(riff_chunk->riff, "RIFF", 4) || 0!=strncmp(riff_chunk->wave, "WAVE", 4)){ ms_warning("Wrong wav header (not RIFF/WAV)"); return -1; } res = ReadFile(d->fd, header2, sizeof(header2), &len, NULL) ; if (!res || len != sizeof(header2)){ ms_warning("Wrong wav header: cannot read file"); return -1; } d->rate=le_uint32(format_chunk->rate); d->nchannels=le_uint16(format_chunk->channel); if (format_chunk->len-0x10>0) { SetFilePointer(d->fd, (format_chunk->len-0x10), NULL, FILE_CURRENT); } d->hsize=sizeof(wave_header_t)-0x10+format_chunk->len; res = ReadFile(d->fd, header3, sizeof(header3), &len, NULL) ; if (!res || len != sizeof(header3)){ ms_warning("Wrong wav header: cannot read file"); return -1; } count=0; while (strncmp(data_chunk->data, "data", 4)!=0 && count<30) { SetFilePointer(d->fd, data_chunk->len, NULL, FILE_CURRENT); count++; d->hsize=d->hsize+len+data_chunk->len; res = ReadFile(d->fd, header3, sizeof(header3), &len, NULL) ; if (!res || len != sizeof(header3)){ ms_warning("Wrong wav header: cannot read file"); return -1; } } #ifdef WORDS_BIGENDIAN d->swap=TRUE; #endif return 0; }