From b12a849bcbdfc2fdcd6026cab709236587769f42 Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Tue, 21 Jan 2003 12:59:56 +0000 Subject: [PATCH] r3834: *** empty log message *** --- Makefile | 6 ++-- wdq2wav.cpp | 79 ++++++++++++++++++++++++++++++++++++++++++++++------- wdq2wav.h | 8 ++++-- 3 files changed, 78 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index f0bf2d6..08a12db 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,17 @@ base := wdq2wav -all: compile +all: compile-linux clean: rm -f $(base) $(base).o -compile: wdq2wav +compile-linux: wdq2wav debug: g++ -g -I. $(base).cpp -o $(base) wdq2wav: wdq2wav.cpp wdq2wav.h - g++ -O2 -I. $(base).cpp -o $(base) + g++ -DLINUX -O2 -I. $(base).cpp -o $(base) install: compile install -m 0755 -o root -g root wdq2wav $(DESTDIR)/usr/bin diff --git a/wdq2wav.cpp b/wdq2wav.cpp index f9c5ef8..0607f12 100644 --- a/wdq2wav.cpp +++ b/wdq2wav.cpp @@ -8,7 +8,7 @@ ** ** Copyright (c) 2003 Kevin Rosenberg ** -** $Id: wdq2wav.cpp,v 1.11 2003/01/21 11:45:38 kevin Exp $ +** $Id: wdq2wav.cpp,v 1.12 2003/01/21 12:59:56 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,7 +26,7 @@ #include -const char* g_szIdStr = "$Id: wdq2wav.cpp,v 1.11 2003/01/21 11:45:38 kevin Exp $"; +const char* g_szIdStr = "$Id: wdq2wav.cpp,v 1.12 2003/01/21 12:59:56 kevin Exp $"; bool g_quiet = false; bool g_verbose = false; @@ -168,14 +168,14 @@ main (int argc, char *argv[]) std::cin.getline (wav_fname, MAX_INPUT_STR); } - if (! wdq2wav (wdq_fname, channel, wav_fname)) + if (! wdq2wav (wdq_fname, channel, wav_fname, play)) return 1; return 0; } bool -wdq2wav (const char* wdq_fname, const int channel, const char *wav_fname) +wdq2wav (const char* wdq_fname, const int channel, const char *wav_fname, bool play) { WindaqFile wdq (wdq_fname); @@ -253,6 +253,9 @@ wdq2wav (const char* wdq_fname, const int channel, const char *wav_fname) return false; } + if (play) + wav.Play(); + return true; } @@ -495,10 +498,11 @@ WavFile::WavFile (WindaqChannel& wdq_channel, const char* fname) info_msg (os.str().c_str()); } - unsigned int nHeaderBytes = 44; - m_nFileBytes = nHeaderBytes + m_nSamples * m_nBytesPerSample; + m_nHeaderBytes = 44; + m_nDataBytes = m_nSamples * m_nBytesPerSample * m_nChannels; + m_nFileBytes = m_nHeaderBytes + m_nDataBytes; - unsigned int nHeaderShortInts = nHeaderBytes / sizeof(signed short int); + unsigned int nHeaderShortInts = m_nHeaderBytes / sizeof(signed short int); m_data = new signed short int [m_nSamples + nHeaderShortInts]; signed short int* input = wdq_channel.m_data; @@ -557,12 +561,11 @@ bool WavFile::fill_header () { char* pData = reinterpret_cast (m_data); - unsigned long data_bytes = m_nSamples * m_nBytesPerSample * m_nChannels; strncpy (pData, "RIFF", 4); // Length of file after 8 byte header - put_int4 (pData + 4, 36 + data_bytes); + put_int4 (pData + 4, 36 + m_nDataBytes); strncpy (pData + 8, "WAVEfmt ", 8); @@ -589,7 +592,7 @@ WavFile::fill_header () strncpy (pData + 36, "data", 4); - put_int4 (pData + 40, data_bytes); + put_int4 (pData + 40, m_nDataBytes); return true; } @@ -625,6 +628,62 @@ WavFile::WriteFile () return true; } +#ifdef WIN32 +#include +#include +#elif defined(LINUX) +#include +#include +#endif + +bool +WavFile::Play () +{ +#ifdef WIN32 + if (PlaySound ((LPCSTR) m_data, 0, SND_MEMORY | SND_NO_DEFAULT)) + return true; +#elif defined(LINUX) + int fd; + if ((fd = open ("/dev/dsp",O_WRONLY)) < 0) { + error_msg ("Error opening /dev/dsp"); + return false; + } + + int format = AFMT_S16_LE; + if (ioctl (fd, SNDCTL_DSP_SETFMT, &format) == -1) { + error_msg ("Error setting DSP format"); + close(fd); return false; } + if (format != AFMT_S16_LE) { + error_msg ("DSP Format not set"); + 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; } + if (channels != m_nChannels) { + error_msg ("Number of channels not set"); + 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; } + + 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 true; +#endif + return false; +} + diff --git a/wdq2wav.h b/wdq2wav.h index 0caab1e..e92e1ac 100644 --- a/wdq2wav.h +++ b/wdq2wav.h @@ -8,7 +8,7 @@ ** ** Copyright (c) 2003 Kevin Rosenberg ** -** $Id: wdq2wav.h,v 1.7 2003/01/21 11:23:09 kevin Exp $ +** $Id: wdq2wav.h,v 1.8 2003/01/21 12:59:56 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 @@ -46,7 +46,7 @@ void error_msg (const char *msg); void info_msg (const char *msg); void info_msg_sans_newline (const char *msg); -bool wdq2wav (const char* wdq_fname, const int channel, const char *wav_fname); +bool wdq2wav (const char* wdq_fname, const int channel, const char *wav_fname, bool play); class WindaqFile { @@ -104,6 +104,8 @@ class WavFile unsigned int m_nBitsPerSample; unsigned int m_nBytesPerSample; signed short int* m_data; + unsigned long int m_nHeaderBytes; + unsigned long int m_nDataBytes; unsigned long int m_nFileBytes; WavFile (WindaqChannel& wdq_channel, const char* fname); @@ -111,6 +113,8 @@ class WavFile bool WriteFile (); + bool Play(); + private: bool fill_header(); }; -- 2.34.1