public WaveBank( AudioEngine audioEngine, string nonStreamingWaveBankFilename ) { if (audioEngine == null) { throw new ArgumentNullException("audioEngine"); } if (String.IsNullOrEmpty(nonStreamingWaveBankFilename)) { throw new ArgumentNullException("nonStreamingWaveBankFilename"); } buffer = TitleContainer.ReadAllBytes( nonStreamingWaveBankFilename ); pin = GCHandle.Alloc(buffer, GCHandleType.Pinned); FAudio.FACTAudioEngine_CreateInMemoryWaveBank( audioEngine.handle, pin.AddrOfPinnedObject(), (uint)buffer.Length, 0, 0, out handle ); engine = audioEngine; selfReference = new WeakReference(this, true); engine.RegisterWaveBank(handle, selfReference); IsDisposed = false; }
public SoundBank(AudioEngine audioEngine, string filename) { if (audioEngine == null) { throw new ArgumentNullException("audioEngine"); } if (String.IsNullOrEmpty(filename)) { throw new ArgumentNullException("filename"); } byte[] buffer = TitleContainer.ReadAllBytes(filename); GCHandle pin = GCHandle.Alloc(buffer, GCHandleType.Pinned); FAudio.FACTAudioEngine_CreateSoundBank( audioEngine.handle, pin.AddrOfPinnedObject(), (uint)buffer.Length, 0, 0, out handle ); pin.Free(); buffer = null; engine = audioEngine; selfReference = new WeakReference(this, true); dspSettings = new FAudio.F3DAUDIO_DSP_SETTINGS(); dspSettings.SrcChannelCount = 1; dspSettings.DstChannelCount = engine.channels; dspSettings.pMatrixCoefficients = Marshal.AllocHGlobal( 4 * (int)dspSettings.SrcChannelCount * (int)dspSettings.DstChannelCount ); engine.RegisterSoundBank(handle, selfReference); IsDisposed = false; }
public AudioEngine( string settingsFile, TimeSpan lookAheadTime, string rendererId ) { if (String.IsNullOrEmpty(settingsFile)) { throw new ArgumentNullException("settingsFile"); } // Read entire file into memory, pin buffer buffer = TitleContainer.ReadAllBytes(settingsFile); pin = GCHandle.Alloc(buffer, GCHandleType.Pinned); // Generate engine parameters FAudio.FACTRuntimeParameters settings = new FAudio.FACTRuntimeParameters(); settings.pGlobalSettingsBuffer = pin.AddrOfPinnedObject(); settings.globalSettingsBufferSize = (uint)buffer.Length; xactNotificationFunc = OnXACTNotification; settings.fnNotificationCallback = Marshal.GetFunctionPointerForDelegate( xactNotificationFunc ); // Special parameters from constructor settings.lookAheadTime = (uint)lookAheadTime.Milliseconds; if (!string.IsNullOrEmpty(rendererId)) { // FIXME: wchar_t? -flibit settings.pRendererID = Marshal.StringToHGlobalAuto(rendererId); } // Init engine, finally FAudio.FACTCreateEngine(0, out handle); if (FAudio.FACTAudioEngine_Initialize(handle, ref settings) != 0) { throw new InvalidOperationException( "Engine initialization failed!" ); } // Free the settings strings if (settings.pRendererID != IntPtr.Zero) { Marshal.FreeHGlobal(settings.pRendererID); } // Grab RendererDetails ushort rendererCount; FAudio.FACTAudioEngine_GetRendererCount( handle, out rendererCount ); if (rendererCount == 0) { Dispose(); throw new NoAudioHardwareException(); } rendererDetails = new RendererDetail[rendererCount]; char[] displayName = new char[0xFF]; char[] rendererID = new char[0xFF]; for (ushort i = 0; i < rendererCount; i += 1) { FAudio.FACTRendererDetails details; FAudio.FACTAudioEngine_GetRendererDetails( handle, i, out details ); unsafe { for (int j = 0; j < 0xFF; j += 1) { displayName[j] = (char)details.displayName[j]; rendererID[j] = (char)details.rendererID[j]; } } rendererDetails[i] = new RendererDetail( new string(displayName), new string(rendererID) ); } // Init 3D audio handle3D = new byte[FAudio.F3DAUDIO_HANDLE_BYTESIZE]; FAudio.FACT3DInitialize( handle, handle3D ); // Grab channel count for DSP_SETTINGS FAudio.FAudioWaveFormatExtensible mixFormat; FAudio.FACTAudioEngine_GetFinalMixFormat( handle, out mixFormat ); channels = mixFormat.Format.nChannels; // All XACT references have to go through here... notificationDesc = new FAudio.FACTNotificationDescription(); }