12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- //
- // demuopl.cpp
- // SDLPal
- //
- // Created by palxex on 14-7-20.
- // Copyright (c) 2014 Wei Mingzhi. All rights reserved.
- //
- #include "demuopl.h"
- #include <string.h>
- CDemuopl::CDemuopl(int rate, bool bit16, bool usestereo)
- : use16bit(bit16), stereo(usestereo), rate(rate), chip(adlib_init(rate))
- {
- currType = TYPE_OPL2;
- }
- CDemuopl::~CDemuopl()
- {
- adlib_release(chip);
- }
- void CDemuopl::init()
- {
- adlib_release(chip);
- chip = adlib_init(rate);
- }
- void CDemuopl::update(short *buf, int samples)
- {
- if (!chip) return;
- short *mixbuf1 = NULL;
- short *outbuf;
- if (use16bit)
- outbuf = buf;
- else
- outbuf = mixbuf1 = new short[samples * 2];
- adlib_getsample(chip, outbuf, samples);
- if (stereo) {
- for (int i = samples - 1; i >= 0; i--) {
- outbuf[i * 2] = outbuf[i];
- outbuf[i * 2 + 1] = outbuf[i];
- }
- }
- //now reduce to 8bit if we need to
- if (!use16bit) {
- for (int i = 0; i < (stereo ? samples * 2 : samples); i++)
- ((char *)buf)[i] = (outbuf[i] >> 8) ^ 0x80;
- delete[] mixbuf1;
- }
- }
- // template methods
- void CDemuopl::write(int reg, int val)
- {
- if (chip) adlib_write(chip, reg, val);
- }
|