Beispiel #1
0
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.");
	}
}
Beispiel #2
0
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);
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}