From: Wouter V. <m97...@us...> - 2003-06-30 19:03:28
|
Update of /cvsroot/openmsx/openMSX/src/cassette In directory sc8-pr-cvs1:/tmp/cvs-serv18853/src/cassette Modified Files: CasImage.cc CasImage.hh CassetteImage.hh CassettePlayer.cc CassettePlayer.hh DummyCassetteImage.cc DummyCassetteImage.hh WavImage.cc WavImage.hh Log Message: Fixed cassette player bug Index: CasImage.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/cassette/CasImage.cc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- CasImage.cc 28 Jun 2003 17:17:25 -0000 1.1 +++ CasImage.cc 30 Jun 2003 19:03:25 -0000 1.2 @@ -1,9 +1,9 @@ #include <stdlib.h> #include <memory.h> -#include <math.h> #include "CasImage.hh" #include "FileContext.hh" #include "File.hh" +#include "EmuTime.hh" // output settings @@ -49,11 +49,11 @@ { } -short CasImage::getSampleAt(float pos) +short CasImage::getSampleAt(const EmuTime &time) { - unsigned p = (unsigned)(pos * OUTPUT_FREQUENCY); - if (p < output.size()) { - return output[p] * 256; + unsigned pos = time.getTicksAt(OUTPUT_FREQUENCY); + if (pos < output.size()) { + return output[pos] * 256; } else { return 0; } @@ -63,11 +63,14 @@ // write a pulse void CasImage::writePulse(int f) { - double length = OUTPUT_FREQUENCY / (baudRate * (f / 1200)); - double scale = 2.0 * M_PI / (double)length; + int length = OUTPUT_FREQUENCY / (baudRate * (f / 1200)); - for (long n = 0; n < (long)length; n++) { - output.push_back((char)(sin((double)n * scale) * 127)); + int i = 0; + for ( ; i < (length / 2); i++) { + output.push_back(127); + } + for ( ; i < length; i++) { + output.push_back(-127); } } @@ -82,10 +85,7 @@ // write silence void CasImage::writeSilence(int s) { - //output.insert(output.end(), s, 0); - for (int i = 0; i < s; i++) { - output.push_back(0); - } + output.insert(output.end(), s, 0); } // write a byte @@ -127,7 +127,6 @@ } while (pos < size) { writeByte(buf[pos++]); - pos++; } return false; } Index: CasImage.hh =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/cassette/CasImage.hh,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- CasImage.hh 28 Jun 2003 17:17:25 -0000 1.1 +++ CasImage.hh 30 Jun 2003 19:03:25 -0000 1.2 @@ -20,7 +20,7 @@ CasImage(FileContext *context, const string &fileName); virtual ~CasImage(); - virtual short getSampleAt(float pos); + virtual short getSampleAt(const EmuTime &time); private: void writePulse(int f); Index: CassetteImage.hh =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/cassette/CassetteImage.hh,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- CassetteImage.hh 28 Jun 2003 17:17:25 -0000 1.1 +++ CassetteImage.hh 30 Jun 2003 19:03:25 -0000 1.2 @@ -3,10 +3,12 @@ #ifndef __CASSETTEIMAGE_HH__ #define __CASSETTEIMAGE_HH__ +class EmuTime; + class CassetteImage { public: - virtual short getSampleAt(float pos) = 0; + virtual short getSampleAt(const EmuTime &time) = 0; }; #endif Index: CassettePlayer.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/cassette/CassettePlayer.cc,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- CassettePlayer.cc 29 Jun 2003 20:08:56 -0000 1.28 +++ CassettePlayer.cc 30 Jun 2003 19:03:25 -0000 1.29 @@ -104,8 +104,7 @@ delete cassette; cassette = tmp; - position = 0.0; // rewind tape (make configurable??) - playPos = 0.0; + rewind(); } void CassettePlayer::removeTape() @@ -114,42 +113,40 @@ cassette = new DummyCassetteImage(); } -float CassettePlayer::updatePosition(const EmuTime &time) +void CassettePlayer::rewind() { - float duration = (time - timeReference).toFloat(); - playPos = position + duration; - return playPos; + tapeTime = EmuTime::zero; + playTapeTime = EmuTime::zero; } -void CassettePlayer::setMotor(bool status, const EmuTime &time) +void CassettePlayer::updatePosition(const EmuTime &time) { - if (motor != status) { - motor = status; - if (motor) { - // motor turned on - //PRT_DEBUG("CassettePlayer motor on"); - timeReference = time; - } else { - // motor turned off - //PRT_DEBUG("CassettePlayer motor off"); - position = updatePosition(time); - } + if (motor) { + tapeTime += (time - prevTime); + playTapeTime = tapeTime; } + prevTime = time; } -short CassettePlayer::getSample(float pos) +void CassettePlayer::setMotor(bool status, const EmuTime &time) +{ + updatePosition(time); + motor = status; +} + +short CassettePlayer::getSample(const EmuTime &time) { if (motor) { - return cassette->getSampleAt(pos); + return cassette->getSampleAt(time); } else { return 0; } } - short CassettePlayer::readSample(const EmuTime &time) { - return getSample(updatePosition(time)); + updatePosition(time); + return getSample(tapeTime); } void CassettePlayer::writeWave(short *buf, int length) @@ -173,8 +170,9 @@ void CassettePlayer::execute(const vector<string> &tokens) { - if (tokens.size() != 2) + if (tokens.size() != 2) { throw CommandException("Syntax error"); + } if (tokens[1] == "eject") { print("Tape ejected"); removeTape(); @@ -197,8 +195,9 @@ void CassettePlayer::tabCompletion(vector<string> &tokens) const { - if (tokens.size() == 2) + if (tokens.size() == 2) { CommandController::completeFileName(tokens); + } } @@ -209,7 +208,7 @@ void CassettePlayer::setSampleRate(int sampleRate) { - delta = 1.0 / sampleRate; + delta = EmuDuration(1.0 / sampleRate); } int* CassettePlayer::updateBuffer(int length) @@ -219,8 +218,8 @@ } int *buf = buffer; while (length--) { - *(buf++) = (((int)getSample(playPos)) * volume) >> 15; - playPos += delta; + *(buf++) = (((int)getSample(playTapeTime)) * volume) >> 15; + playTapeTime += delta; } return buffer; } Index: CassettePlayer.hh =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/cassette/CassettePlayer.hh,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- CassettePlayer.hh 29 Jun 2003 20:08:56 -0000 1.16 +++ CassettePlayer.hh 30 Jun 2003 19:03:25 -0000 1.17 @@ -53,13 +53,14 @@ virtual int* updateBuffer(int length); private: - float updatePosition(const EmuTime &time); - short getSample(float pos); + void rewind(); + void updatePosition(const EmuTime &time); + short getSample(const EmuTime &time); CassetteImage *cassette; bool motor; - EmuTime timeReference; - float position; + EmuTime tapeTime; + EmuTime prevTime; // Tape Command virtual void execute(const vector<string> &tokens); @@ -69,8 +70,8 @@ // SoundDevice int *buffer; short volume; - float delta; - float playPos; + EmuDuration delta; + EmuTime playTapeTime; }; #endif Index: DummyCassetteImage.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/cassette/DummyCassetteImage.cc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- DummyCassetteImage.cc 28 Jun 2003 17:17:25 -0000 1.1 +++ DummyCassetteImage.cc 30 Jun 2003 19:03:25 -0000 1.2 @@ -10,7 +10,7 @@ { } -short DummyCassetteImage::getSampleAt(float pos) +short DummyCassetteImage::getSampleAt(const EmuTime &time) { return 0; } Index: DummyCassetteImage.hh =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/cassette/DummyCassetteImage.hh,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- DummyCassetteImage.hh 28 Jun 2003 17:17:25 -0000 1.1 +++ DummyCassetteImage.hh 30 Jun 2003 19:03:25 -0000 1.2 @@ -11,7 +11,7 @@ DummyCassetteImage(); virtual ~DummyCassetteImage(); - virtual short getSampleAt(float pos); + virtual short getSampleAt(const EmuTime &time); }; #endif Index: WavImage.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/cassette/WavImage.cc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- WavImage.cc 28 Jun 2003 17:17:25 -0000 1.1 +++ WavImage.cc 30 Jun 2003 19:03:25 -0000 1.2 @@ -3,6 +3,7 @@ #include "WavImage.hh" #include "FileContext.hh" #include "File.hh" +#include "EmuTime.hh" WavImage::WavImage(FileContext *context, const string &fileName) @@ -28,11 +29,11 @@ } } -short WavImage::getSampleAt(float pos) +short WavImage::getSampleAt(const EmuTime &time) { - unsigned index = (unsigned)(pos * audioSpec.freq); - if (index < (audioLength / 2)) { - return ((short*)audioBuffer)[index]; + int pos = time.getTicksAt(audioSpec.freq); + if (pos < (audioLength / 2)) { + return ((short*)audioBuffer)[pos]; } else { return 0; } Index: WavImage.hh =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/cassette/WavImage.hh,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- WavImage.hh 28 Jun 2003 17:17:25 -0000 1.1 +++ WavImage.hh 30 Jun 2003 19:03:25 -0000 1.2 @@ -19,7 +19,7 @@ WavImage(FileContext *context, const string &fileName); virtual ~WavImage(); - virtual short getSampleAt(float pos); + virtual short getSampleAt(const EmuTime &time); private: SDL_AudioSpec audioSpec; |