#include <fcntl.h>
#include <sys/soundcard.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>
#include <cstring>
#include <fstream>
#include <memory>
#include <vector>
#include <iostream>
#include <sidplayfp/sidplayfp.h>
#include <sidplayfp/SidTune.h>
#include <sidplayfp/SidInfo.h>
#include <sidplayfp/builders/residfp.h>
#define KERNAL_PATH ""
#define BASIC_PATH ""
#define CHARGEN_PATH ""
#define SAMPLERATE 48000
#if __cplusplus < 201103L
# define unique_ptr auto_ptr
#endif
char* loadRom(const char* path, size_t romSize)
{
char* buffer = 0;
std::ifstream is(path, std::ios::binary);
if (is.good())
{
buffer = new char[romSize];
is.read(buffer, romSize);
}
is.close();
return buffer;
}
int main(int, char* argv[])
{
{
char *kernal = loadRom(KERNAL_PATH, 8192);
char *basic = loadRom(BASIC_PATH, 8192);
char *chargen = loadRom(CHARGEN_PATH, 4096);
m_engine.
setRoms((
const uint8_t*)kernal, (
const uint8_t*)basic, (
const uint8_t*)chargen);
delete [] kernal;
delete [] basic;
delete [] chargen;
}
unsigned int maxsids = (m_engine.
info ()).maxsids();
rs->create(maxsids);
if (!rs->getStatus())
{
std::cerr << rs->error() << std::endl;
return -1;
}
std::unique_ptr<SidTune> tune(
new SidTune(argv[1]));
if (!tune->getStatus())
{
std::cerr << tune->statusString() << std::endl;
return -1;
}
tune->selectSong(0);
{
std::cerr << m_engine.
error() << std::endl;
return -1;
}
if (!m_engine.
load(tune.get()))
{
std::cerr << m_engine.
error() << std::endl;
return -1;
}
int handle=::open("/dev/dsp", O_WRONLY, 0);
int format=AFMT_S16_LE;
ioctl(handle, SNDCTL_DSP_SETFMT, &format);
int chn=1;
ioctl(handle, SNDCTL_DSP_CHANNELS, &chn);
int sampleRate=SAMPLERATE;
ioctl(handle, SNDCTL_DSP_SPEED, &sampleRate);
int bufferSize;
ioctl(handle, SNDCTL_DSP_GETBLKSIZE, &bufferSize);
uint_least32_t bufferSamples = static_cast<uint_least32_t>(bufferSize) / sizeof(short);
std::vector<short> buffer(bufferSamples);
for (int i=0; i<1000; i++)
{
uint_least32_t res = m_engine.
play(&buffer.front(), bufferSamples);
if (!m_engine.
isPlaying() || (res < bufferSamples))
{
std::cerr << m_engine.
error() << std::endl;
break;
}
::write(handle, &buffer.front(), bufferSize);
}
::close(handle);
}
Definition SidConfig.h:40
uint_least32_t frequency
Definition SidConfig.h:139
@ MONO
One channel mono playback.
Definition SidConfig.h:45
playback_t playback
Definition SidConfig.h:134
bool fastSampling
Definition SidConfig.h:179
@ INTERPOLATE
Interpolation.
Definition SidConfig.h:85
sidbuilder * sidEmulation
Definition SidConfig.h:153
sampling_method_t samplingMethod
Definition SidConfig.h:173
Definition sidplayfp.h:47
const SidInfo & info() const
Definition sidplayfp.cpp:69
const SidConfig & config() const
Definition sidplayfp.cpp:49
bool load(SidTune *tune)
Definition sidplayfp.cpp:64
const char * error() const
Definition sidplayfp.cpp:84
uint_least32_t play(short *buffer, uint_least32_t count)
Definition sidplayfp.cpp:59
void setRoms(const uint8_t *kernal, const uint8_t *basic=0, const uint8_t *character=0)
Definition sidplayfp.cpp:113
bool isPlaying() const
Definition sidplayfp.cpp:104