demuopl.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * Adplug - Replayer for many OPL2/OPL3 audio file formats.
  3. * Copyright (C) 1999 - 2005 Simon Peter, <dn.tlp@gmx.net>, et al.
  4. *
  5. * This library is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU Lesser General Public
  7. * License as published by the Free Software Foundation; either
  8. * version 2.1 of the License, or (at your option) any later version.
  9. *
  10. * This library is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * Lesser General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Lesser General Public
  16. * License along with this library; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. *
  19. * demuopl.cpp - Emulated OPL using DOSBOX's emulator, by Pal Lockheart
  20. * <palxex@gmail.com> on 2014-07-20.
  21. */
  22. #include "demuopl.h"
  23. #include <string.h>
  24. CDemuopl::CDemuopl(int rate, bool bit16, bool usestereo)
  25. : use16bit(bit16), stereo(usestereo), rate(rate), chip(adlib_init(rate))
  26. {
  27. currType = TYPE_OPL2;
  28. }
  29. CDemuopl::~CDemuopl()
  30. {
  31. adlib_release(chip);
  32. }
  33. void CDemuopl::init()
  34. {
  35. adlib_release(chip);
  36. chip = adlib_init(rate);
  37. }
  38. void CDemuopl::update(short *buf, int samples)
  39. {
  40. if (!chip) return;
  41. short *mixbuf1 = NULL;
  42. short *outbuf;
  43. if (use16bit)
  44. outbuf = buf;
  45. else
  46. outbuf = mixbuf1 = new short[samples * 2];
  47. adlib_getsample(chip, outbuf, samples);
  48. if (stereo) {
  49. for (int i = samples - 1; i >= 0; i--) {
  50. outbuf[i * 2] = outbuf[i];
  51. outbuf[i * 2 + 1] = outbuf[i];
  52. }
  53. }
  54. //now reduce to 8bit if we need to
  55. if (!use16bit) {
  56. for (int i = 0; i < (stereo ? samples * 2 : samples); i++)
  57. ((char *)buf)[i] = (outbuf[i] >> 8) ^ 0x80;
  58. delete[] mixbuf1;
  59. }
  60. }
  61. // template methods
  62. void CDemuopl::write(int reg, int val)
  63. {
  64. if (chip) adlib_write(chip, reg, val);
  65. }