You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
3.5 KiB
C
145 lines
3.5 KiB
C
/*
|
|
* C Implementation: wavcmp
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
* Author: Nicolas Botti <rududu@laposte.net>, (C) 2007
|
|
*
|
|
* Copyright: See COPYING file that comes with this distribution
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include <libwaveformat.h>
|
|
|
|
t_wav_uint32 wav_write(void* p_user_data, void const* p_buffer, t_wav_uint32 p_bytes)
|
|
{
|
|
return (t_wav_uint32) fwrite(p_buffer, 1, p_bytes, (FILE*) p_user_data);
|
|
}
|
|
|
|
t_wav_uint32 wav_seek(void* p_user_data, t_wav_uint32 p_position)
|
|
{
|
|
return (t_wav_uint32) !fseek((FILE*) p_user_data, p_position, SEEK_SET);
|
|
}
|
|
|
|
t_wav_uint32 wav_read(void * p_user_data,void * p_buffer,t_wav_uint32 p_bytes)
|
|
{
|
|
return (t_wav_uint32) fread(p_buffer, 1, p_bytes, (FILE*) p_user_data);
|
|
}
|
|
|
|
static void
|
|
usage(const char *exename)
|
|
{
|
|
printf("Usage: %s <file1.wav> <file2.wav> [<diff.wav>]\n", exename);
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
t_wav_output_file wav_output;
|
|
t_wav_input_file wav_in_1;
|
|
t_wav_input_file wav_in_2;
|
|
int is_wav_output;
|
|
int err;
|
|
int total_samples, total_diff;
|
|
|
|
if(4 < argc && argc < 3)
|
|
{
|
|
usage(argv[0]);
|
|
return 0;
|
|
}
|
|
|
|
t_wav_input_file_callback wavi_fc;
|
|
memset(&wav_in_1, 0, sizeof wav_in_1);
|
|
wavi_fc.m_read = wav_read;
|
|
wavi_fc.m_user_data = fopen(argv[1], "rb");
|
|
if(!wavi_fc.m_user_data) return 1;
|
|
if (! waveformat_input_open(&wav_in_1, wavi_fc)) return 1;
|
|
|
|
memset(&wav_in_2, 0, sizeof wav_in_2);
|
|
wavi_fc.m_read = wav_read;
|
|
wavi_fc.m_user_data = fopen(argv[2], "rb");
|
|
if(!wavi_fc.m_user_data) return 1;
|
|
if (! waveformat_input_open(&wav_in_2, wavi_fc)) return 1;
|
|
|
|
if (wav_in_1.m_channels != wav_in_2.m_channels) {
|
|
printf("Channel number doesn't match\n");
|
|
return 1;
|
|
}
|
|
if (wav_in_1.m_samples_per_sec != wav_in_2.m_samples_per_sec) {
|
|
printf("Sample rate doesn't match\n");
|
|
return 1;
|
|
}
|
|
if (wav_in_1.m_bits_per_sample != wav_in_2.m_bits_per_sample) {
|
|
printf("Sample size doesn't match\n");
|
|
return 1;
|
|
}
|
|
if (wav_in_1.m_data_size != wav_in_2.m_data_size) {
|
|
printf("File length doesn't match\n");
|
|
return 1;
|
|
}
|
|
|
|
is_wav_output = argc > 3;
|
|
if(is_wav_output)
|
|
{
|
|
t_wav_output_file_callback wavo_fc;
|
|
memset(&wav_output, 0, sizeof wav_output);
|
|
wavo_fc.m_seek = wav_seek;
|
|
wavo_fc.m_write = wav_write;
|
|
wavo_fc.m_user_data = fopen(argv[3], "wb");
|
|
if(!wavo_fc.m_user_data) return 1;
|
|
err = waveformat_output_open(&wav_output, wavo_fc, wav_in_1.m_channels, wav_in_1.m_bits_per_sample, 0, wav_in_1.m_samples_per_sec, wav_in_2.m_data_size);
|
|
if(!err) return 1;
|
|
}
|
|
|
|
total_samples = 0;
|
|
total_diff = 0;
|
|
|
|
while(1)
|
|
{
|
|
short sample_buff[2][512];
|
|
unsigned int samples[2];
|
|
|
|
samples[0] = waveformat_input_process_int16(& wav_in_1, sample_buff[0], 512);
|
|
samples[1] = waveformat_input_process_int16(& wav_in_2, sample_buff[1], 512);
|
|
|
|
if (samples[0] != samples[1] || samples[0] == 0)
|
|
break;
|
|
|
|
int i = 0;
|
|
for( ; i < samples[0]; i++) {
|
|
sample_buff[0][i] -= sample_buff[1][i];
|
|
if (sample_buff[0][i]) {
|
|
printf("diff @ sample %i channel %i : %i\n", (total_samples + i) / wav_in_1.m_channels, (total_samples + i) % wav_in_1.m_channels, sample_buff[0][i]);
|
|
total_diff++;
|
|
}
|
|
}
|
|
total_samples += samples[0];
|
|
|
|
if(is_wav_output)
|
|
if(waveformat_output_process_int16(&wav_output, sample_buff[0], samples[0]) < 0)
|
|
break;
|
|
}
|
|
|
|
if (total_diff != 0)
|
|
printf("%i diff found\n", total_diff);
|
|
else
|
|
printf("no diff found\n");
|
|
|
|
waveformat_input_close(&wav_in_1);
|
|
waveformat_input_close(&wav_in_2);
|
|
fclose(wav_in_1.m_callback.m_user_data);
|
|
fclose(wav_in_2.m_callback.m_user_data);
|
|
|
|
if(is_wav_output)
|
|
{
|
|
waveformat_output_close(&wav_output);
|
|
fclose(wav_output.m_callback.m_user_data);
|
|
}
|
|
|
|
return 0;
|
|
}
|