| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- using System;
- using System.IO;
- using Microsoft.Xna.Framework;
- #if _WINDOWS && !_X64
- using DirectMidi;
- #endif
- using System.Diagnostics;
- namespace OpenVIII.AV.Midi
- {
- /// <summary>
- /// Direct Music
- /// </summary>
- /// <see cref="http://directmidi.sourceforge.net/"/>
- /// <seealso cref="http://directmidinet.sourceforge.net/"/>
- public sealed class DirectMedia : IDisposable
- {
- #if _WINDOWS && (_X86 || !_X64)
- private CDirectMusic cdm;
- private CDLSLoader loader;
- private CSegment segment;
- private CAPathPerformance path;
- private CPortPerformance cport; //public explicit
- private COutputPort outport;
- private CCollection ccollection;
- private CInstrument[] instruments;
- public const int S_OK = 0x00000000;
- public void Play(string pt, bool loop = true)
- {
- if (cdm == null)
- {
- cdm = new CDirectMusic();
- cdm.Initialize();
- loader = new CDLSLoader();
- loader.Initialize();
- loader.LoadSegment(pt, out segment);
- ccollection = new CCollection();
- string pathDLS = Path.Combine(Memory.FF8DIRdata, "Music/dmusic_backup/FF8.dls");
- if (!File.Exists(pathDLS))
- {
- pathDLS = Path.Combine(Memory.FF8DIRdata, "Music/dmusic/FF8.dls");
- }
- loader.LoadDLS(pathDLS, out ccollection);
- uint dwInstrumentIndex = 0;
- while (ccollection.EnumInstrument(++dwInstrumentIndex, out INSTRUMENTINFO iInfo) == S_OK)
- {
- Debug.WriteLine(iInfo.szInstName);
- }
- instruments = new CInstrument[dwInstrumentIndex];
- path = new CAPathPerformance();
- path.Initialize(cdm, null, null, DMUS_APATH.DYNAMIC_3D, 128);
- cport = new CPortPerformance();
- cport.Initialize(cdm, null, null);
- outport = new COutputPort();
- outport.Initialize(cdm);
- uint dwPortCount = 0;
- INFOPORT infoport;
- do
- {
- outport.GetPortInfo(++dwPortCount, out infoport);
- }
- while ((infoport.dwFlags & DMUS_PC.SOFTWARESYNTH) == 0);
- outport.SetPortParams(0, 0, 0, DirectMidi.SET.REVERB | DirectMidi.SET.CHORUS, 44100);
- outport.ActivatePort(infoport);
- cport.AddPort(outport, 0, 1);
- for (int i = 0; i < dwInstrumentIndex; i++)
- {
- ccollection.GetInstrument(out instruments[i], i);
- outport.DownloadInstrument(instruments[i]);
- }
- segment.Download(cport);
- if(!loop)
- segment.SetRepeats(0);
- cport.PlaySegment(segment);
- }
- else
- {
- cport.Stop(segment);
- segment.Dispose();
- //segment.ConnectToDLS
- loader.LoadSegment(pt, out segment);
- segment.Download(cport);
- if (!loop)
- segment.SetRepeats(0);
- cport.PlaySegment(segment);
- cdm.Dispose();
- }
- //GCHandle.Alloc(cdm, GCHandleType.Pinned);
- //GCHandle.Alloc(loader, GCHandleType.Pinned);
- //GCHandle.Alloc(segment, GCHandleType.Pinned);
- //GCHandle.Alloc(path, GCHandleType.Pinned);
- //GCHandle.Alloc(cport, GCHandleType.Pinned);
- //GCHandle.Alloc(outport, GCHandleType.Pinned);
- //GCHandle.Alloc(infoport, GCHandleType.Pinned);
- }
- public void Stop() => cport.StopAll();
- public void Dispose()
- {
- Stop();
- segment.Dispose();
- instruments.ForEach(action => action.Dispose());
- cport.Dispose();
- ccollection.Dispose();
- loader.Dispose();
- outport.Dispose();
- path.Dispose();
- cdm.Dispose();
- }
- #else
- public void Play(string pt)
- {}
- public void Stop()
- {}
- public void Dispose()
- {}
- #endif
- }
- }
|