X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=wdq2wav.cpp;h=288a9c6c0e14e67b8357e567eecdd2000559e8de;hb=cc76f2cc78bc6ddcc446bc0b6cf08c6e5e7808ea;hp=0607f123e46d6fa0621065261bd82722dc4029b6;hpb=b12a849bcbdfc2fdcd6026cab709236587769f42;p=wdq2wav.git diff --git a/wdq2wav.cpp b/wdq2wav.cpp index 0607f12..288a9c6 100644 --- a/wdq2wav.cpp +++ b/wdq2wav.cpp @@ -8,7 +8,7 @@ ** ** Copyright (c) 2003 Kevin Rosenberg ** -** $Id: wdq2wav.cpp,v 1.12 2003/01/21 12:59:56 kevin Exp $ +** $Id: wdq2wav.cpp,v 1.16 2003/02/12 07:24:32 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -26,12 +26,36 @@ #include -const char* g_szIdStr = "$Id: wdq2wav.cpp,v 1.12 2003/01/21 12:59:56 kevin Exp $"; +const char* g_szIdStr = "$Id: wdq2wav.cpp,v 1.16 2003/02/12 07:24:32 kevin Exp $"; bool g_quiet = false; bool g_verbose = false; bool g_debug = false; + +#ifdef WIN32 +#define lseek _lseek +#define close _close +#define open _open +#define read _read +#define write _write +#define O_BINARY _O_BINARY +#define O_RDONLY _O_RDONLY +#define O_WRONLY _O_WRONLY +#define O_RDWR _O_RDRW +#define O_TRUNC _O_TRUNC +#define O_CREAT _O_CREAT +const int g_fileMode = _S_IWRITE | _S_IREAD; +struct fpos_t std::_Fpz = {0,0}; +#else +const int g_fileMode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; +// Define as NULL for non-Windows platforms +#ifndef O_BINARY +#define O_BINARY 0 +#endif +#endif + + void error_msg (const char *msg) { @@ -60,7 +84,7 @@ fileBasename (const char* filename) char * str_rm_tail (char *str, const char* const charlist) { - int i; + size_t i; for (i = strlen(str) - 1; i >= 0; i--) if (strchr (charlist, str[i]) != NULL) @@ -306,7 +330,7 @@ WindaqFile::ReadHeader () unsigned short int tmp2; m_valid = false; - if ((m_fd = open (m_strFile.c_str(), O_RDONLY)) < 0) { + if ((m_fd = open (m_strFile.c_str(), O_RDONLY | O_BINARY)) < 0) { m_error = "Unable to open file"; return false; } @@ -432,18 +456,19 @@ WindaqChannel::read_channel_data () m_units = units; unsigned int row_bytes = 2 * r_wdq.m_nChannels; - signed short int sample_row [row_bytes]; + signed short int *sample_row = new signed short int [row_bytes]; signed short int* psample = &sample_row[m_channel - 1]; lseek (fd, r_wdq.m_nHeader_bytes, SEEK_SET); - long int i; + unsigned long int i; signed short int data_max, data_min; for (i = 0; i < r_wdq.m_nSamples; i++) { if (read (fd, sample_row, row_bytes) != row_bytes) { std::ostringstream os; os << "Error reading file at " << i; error_msg (os.str().c_str()); + delete sample_row; return false; } signed short int v = *psample; @@ -472,6 +497,7 @@ WindaqChannel::read_channel_data () m_max_scaled_data = (m_slope * data_max) + m_intercept; m_min_scaled_data = (m_slope * data_min) + m_intercept; + delete sample_row; return true; } @@ -513,7 +539,7 @@ WavFile::WavFile (WindaqChannel& wdq_channel, const char* fname) if (! fill_header ()) return; - long int i; + unsigned long int i; for (i = 0; i < m_nSamples; i++) { double value = input[i]; value = (slope * value) + intercept; @@ -607,8 +633,7 @@ WavFile::WriteFile () return false; if (m_fd == 0) - if ((m_fd = open (m_strFile.c_str(), O_WRONLY | O_TRUNC | O_CREAT, - S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == 0) { + if ((m_fd = open (m_strFile.c_str(), O_WRONLY | O_BINARY | O_TRUNC | O_CREAT, g_fileMode)) == 0) { std::ostringstream os; os << "Error opening output file " << m_strFile.c_str(); error_msg (os.str().c_str()); @@ -640,11 +665,11 @@ bool WavFile::Play () { #ifdef WIN32 - if (PlaySound ((LPCSTR) m_data, 0, SND_MEMORY | SND_NO_DEFAULT)) + if (PlaySound ((LPCSTR) m_data, 0, SND_MEMORY | SND_NODEFAULT)) return true; #elif defined(LINUX) int fd; - if ((fd = open ("/dev/dsp",O_WRONLY)) < 0) { + if ((fd = open ("/dev/dsp",O_WRONLY)) == -1) { error_msg ("Error opening /dev/dsp"); return false; } @@ -652,35 +677,43 @@ WavFile::Play () int format = AFMT_S16_LE; if (ioctl (fd, SNDCTL_DSP_SETFMT, &format) == -1) { error_msg ("Error setting DSP format"); - close(fd); return false; } + close(fd); return false; + } if (format != AFMT_S16_LE) { error_msg ("DSP Format not set"); - close(fd); return false; } + close(fd); return false; + } int channels = m_nChannels; if (ioctl (fd, SNDCTL_DSP_CHANNELS, &format) == -1) { error_msg ("Error setting number of channels"); - close(fd); return false; } + close(fd); return false; + } if (channels != m_nChannels) { error_msg ("Number of channels not set"); - close(fd); return false; } + close(fd); return false; + } int speed = static_cast(m_rate + 0.5); if (ioctl (fd, SNDCTL_DSP_SPEED, &speed) == -1) { error_msg ("Error setting sample rate"); - close(fd); return false; } - double set_speed = speed; - if (fabs (set_speed - m_rate) / m_rate > 0.1) { - error_msg ("Sample rate not set"); - close(fd); return false; } + close(fd); return false; + } + if (speed != m_rate && ! g_quiet) { + std::ostringstream os; + os << "Warning: Sample rate set to " << speed << ", not " << m_rate; + error_msg (os.str().c_str()); + } if (write (fd, reinterpret_cast(m_data) + m_nHeaderBytes, m_nDataBytes) != m_nDataBytes) { error_msg ("Error writing audio samples"); - close(fd); return false; } + close(fd); return false; + } close (fd); return true; +#else #endif return false;