Esempio n. 1
0
 unsafe void AllocateHeaders()
 {
     if (this._hwih == IntPtr.Zero)
     {
         throw new InvalidOperationException();
     }
     for (int i = 0; i < _headers.Length; i++)
     {
         if (_headers[i] == IntPtr.Zero)
         {
             WaveHeader *pwh = (WaveHeader *)Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WaveHeader)));
             (*pwh).dwFlags        = 0;
             (*pwh).dwBufferLength = _cc
                                     * _wfx.nBlockAlign;
             (*pwh).lpData = Marshal.AllocHGlobal((*pwh).dwBufferLength);
             (*pwh).dwUser = IntPtr.Zero;
             _headers[i]   = (IntPtr)pwh;
             WinMM.Throw(
                 WinMM.waveInPrepareHeader(this._hwih, _headers[i], Marshal.SizeOf(typeof(WaveHeader))),
                 WinMM.ErrorSource.WaveOut);
             WinMM.Throw(
                 WinMM.waveInAddBuffer(this._hwih, _headers[i], Marshal.SizeOf(typeof(WaveHeader))),
                 WinMM.ErrorSource.WaveOut);
         }
     }
 }
Esempio n. 2
0
File: Mic.cs Progetto: azret/mozart
    Mic32 OpenMic()
    {
        var hMic32 = new Microsoft.WinMM.Mic32(1024, 44100, (hMic, hWaveHeader) => {
            WaveHeader *pwh = (WaveHeader *)hWaveHeader;
            if (pwh != null)
            {
                short *psData =
                    (short *)((*pwh).lpData);
                hMic.CaptureData(pwh, psData);
                if (pwh != null)
                {
                    (*pwh).dwFlags = (*pwh).dwFlags & ~WaveHeaderFlags.Done;
                }
                WinMM.Throw(
                    WinMM.waveInAddBuffer(hMic.Handle, hWaveHeader, Marshal.SizeOf(typeof(WaveHeader))),
                    WinMM.ErrorSource.WaveIn);
            }
            PostWinMMMessage(hMic, hWaveHeader);
        });

        try {
            hMic32.Open(false);
        } catch (Exception e) {
            Console.Error?.WriteLine(e);
            hMic32.Dispose();
            return(null);
        }
        return(hMic32);
    }
Esempio n. 3
0
 unsafe void FreeHeaders()
 {
     for (int i = 0; i < _headers.Length; i++)
     {
         WaveHeader *pwh = (WaveHeader *)_headers[i];
         Marshal.FreeHGlobal((*pwh).lpData);
         Marshal.FreeHGlobal((IntPtr)pwh);
         _headers[i] = IntPtr.Zero;
     }
 }
Esempio n. 4
0
 public unsafe void CaptureData(WaveHeader *pwh, short *psData)
 {
     lock (_dataLock) {
         for (int s = 0; s < _cc; s++)
         {
             float ch1 = (psData[(s * Channels)] / 32767.0f),
                   ch2 = (psData[(s * Channels) + 1] / 32767.0f);
             _CH1[s] = (float)ch1;
             _CH2[s] = (float)ch2;
         }
     }
 }
Esempio n. 5
0
        public override void Create(int numBuffers)
        {
            waveHeaderSize = Marshal.SizeOf(default(WaveHeader));
            headers        = Marshal.AllocHGlobal(waveHeaderSize * numBuffers);
            dataHandles    = new IntPtr[numBuffers];
            dataSizes      = new int[numBuffers];

            for (int i = 0; i < numBuffers; i++)
            {
                WaveHeader *hdr = (WaveHeader *)headers + i;
                hdr->Flags = WaveHeaderFlags.Done;
            }
            NumBuffers = numBuffers;
        }
Esempio n. 6
0
        public override bool IsCompleted(int index)
        {
            WaveHeader *hdr = (WaveHeader *)headers + index;

            if ((hdr->Flags & WaveHeaderFlags.Done) == 0)
            {
                return(false);
            }

            if ((hdr->Flags & WaveHeaderFlags.Prepared) != 0)
            {
                uint result = WinMM.waveOutUnprepareHeader(devHandle, (IntPtr)hdr, waveHeaderSize);
                CheckError(result, "UnprepareHeader");
            }
            return(true);
        }
Esempio n. 7
0
        public override void BufferData(int index, AudioChunk chunk)
        {
            if (chunk.Length > dataSizes[index])
            {
                IntPtr ptr = dataHandles[index];
                if (ptr != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(ptr);
                }
                dataHandles[index] = Marshal.AllocHGlobal(chunk.Length);
            }

            IntPtr handle = dataHandles[index];

            fixed(byte *data = chunk.Data)
            {
                MemUtils.memcpy((IntPtr)data, handle, chunk.Length);
                ApplyVolume(handle, chunk);
            }

            WaveHeader header = default(WaveHeader);

            header.DataBuffer   = handle;
            header.BufferLength = chunk.Length;
            header.Loops        = 1;

            WaveHeader *hdr = (WaveHeader *)headers + index;

            *hdr = header;

            uint result = WinMM.waveOutPrepareHeader(devHandle, (IntPtr)hdr, waveHeaderSize);

            CheckError(result, "PrepareHeader");
            result = WinMM.waveOutWrite(devHandle, (IntPtr)hdr, waveHeaderSize);
            CheckError(result, "Write");
        }