Example #1
0
static void
wav_start_write(int fd, WAVEHDR *fileheader, struct ng_audio_fmt *audio)
{
    wav_init_header(fileheader,audio);
    write(fd,fileheader,sizeof(WAVEHDR));
}
Example #2
0
/**
 * Record directly from a device to a file.
 * @param device The device.
 * @param file The file.
 * @return Error code.
 */
int drecord(const char *device, const char *file)
{
	int ret = EOK;
	audio_pcm_sess_t *session = NULL;
	if (str_cmp(device, "default") == 0) {
		session = audio_pcm_open_default();
	} else {
		session = audio_pcm_open(device);
	}
	if (!session) {
		printf("Failed to connect to device %s.\n", device);
		return 1;
	}
	printf("Recording on device: %s.\n", device);
	if (audio_pcm_query_cap(session, AUDIO_CAP_CAPTURE) <= 0) {
		printf("Device %s does not support recording\n", device);
		ret = ENOTSUP;
		goto close_session;
	}

	const char* info = NULL;
	ret = audio_pcm_get_info_str(session, &info);
	if (ret != EOK) {
		printf("Failed to get PCM info.\n");
		goto close_session;
	}
	printf("Capturing on %s.\n", info);
	free(info);

	record_t rec;
	record_initialize(&rec, session);

	ret = audio_pcm_get_buffer(rec.device, &rec.buffer.base,
	    &rec.buffer.size);
	if (ret != EOK) {
		printf("Failed to get PCM buffer: %s.\n", str_error(ret));
		goto close_session;
	}
	printf("Buffer: %p %zu.\n", rec.buffer.base, rec.buffer.size);

	rec.file = fopen(file, "w");
	if (rec.file == NULL) {
		ret = ENOENT;
		printf("Failed to open file: %s.\n", file);
		goto cleanup;
	}

	wave_header_t header;
	fseek(rec.file, sizeof(header), SEEK_SET);
	if (ret != EOK) {
		printf("Error parsing wav header\n");
		goto cleanup;
	}
	if (audio_pcm_query_cap(rec.device, AUDIO_CAP_INTERRUPT) > 0)
		record_fragment(&rec, format);
	else
		printf("Recording method is not supported");
	//TODO consider buffer position interface

	wav_init_header(&header, format, ftell(rec.file) - sizeof(header));
	fseek(rec.file, 0, SEEK_SET);
	fwrite(&header, sizeof(header), 1, rec.file);

cleanup:
	fclose(rec.file);
	as_area_destroy(rec.buffer.base);
	audio_pcm_release_buffer(rec.device);
close_session:
	audio_pcm_close(session);
	return ret == EOK ? 0 : 1;
}
Example #3
0
static void wav_start_write(FILE* fd, WAVEHDR *fileheader)
{
    wav_init_header(fileheader);
    fwrite(fileheader,1, sizeof(WAVEHDR), fd);
}
Example #4
0
NuvieIOBuffer *ConverseSpeech::load_speech(std::string filename, uint16 sample_num)
{
 unsigned char *compressed_data, *raw_audio, *wav_data;
 sint16 *converted_audio;
 uint32 decomp_size;
 uint32 upsampled_size;
 sint16 sample=0, prev_sample;
 U6Lib_n sam_file;
 U6Lzw lzw;
 NuvieIOBuffer *wav_buffer = 0;
 uint32 j, k;
 
 sam_file.open(filename, 4);
 
 compressed_data = sam_file.get_item(sample_num, NULL);
 raw_audio = lzw.decompress_buffer(compressed_data, sam_file.get_item_size(sample_num), decomp_size);
 
 free(compressed_data);
 
 if(raw_audio != NULL)
  {
   wav_buffer = new NuvieIOBuffer();
   upsampled_size = decomp_size + (int)floor((decomp_size - 1) / 4) * (2 + 2 + 2 + 1);

   switch((decomp_size - 1) % 4)
    {
     case 1 : upsampled_size += 2; break;
     case 2 : upsampled_size += 4; break;
     case 3 : upsampled_size += 6; break;
    }
   
   DEBUG(0,LEVEL_DEBUGGING,"decomp_size %d, upsampled_size %d\n", decomp_size, upsampled_size);
   
   wav_data = (unsigned char *)malloc(upsampled_size * sizeof(sint16) + 44); // 44 = size of wav header
   
   wav_buffer->open(wav_data, upsampled_size * sizeof(sint16) + 44, false);
   wav_init_header(wav_buffer, upsampled_size);
   
   converted_audio = (sint16 *)&wav_data[44];
   
   prev_sample = convert_sample(raw_audio[0]); 
   
   for(j=1,k=0;j<decomp_size;j++,k++)
    {
     converted_audio[k] = prev_sample;

     sample = convert_sample(raw_audio[j]);

     switch(j % 4) // calculate the in-between samples using linear interpolation.
       {
        case 0 : 
        case 1 : 
        case 2 : 
                 converted_audio[k+1] = (sint16)(0.666 * (float)prev_sample + 0.333 * (float)sample);
                 converted_audio[k+2] = (sint16)(0.333 * (float)prev_sample + 0.666 * (float)sample);             
                 k += 2;
                 break;
        case 3 : converted_audio[k+1] = (sint16)(0.5 * (float)(prev_sample + sample));
                 k += 1;
                 break;
       }

     prev_sample = sample;
    }
    
   converted_audio[k] = sample;
  }
 
 free(raw_audio);
  
 return wav_buffer;
}