Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        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();
        }