/// <summary> /// Writes data to the buffer. /// </summary> /// <returns>True on success.</returns> public bool WriteData() { int read; lock (_waveOut.Stream) { read = _waveOut.Stream.Read(_buffer, 0, _buffer.Length); } if (read > 0) { if (_disposed) { return(false); } _waveOut.AudioMixer.ApplyEffects(_buffer, _waveOut.Format); Array.Clear(_buffer, read, _buffer.Length - read); MMResult result = MMInterops.waveOutWrite(_waveOut.WaveOutHandle, _header, Marshal.SizeOf(_header)); if (result != MMResult.MMSYSERR_NOERROR) { WaveOutResult.Try(result); } return(result == MMResult.MMSYSERR_NOERROR); } return(false); }
public void OnResult(MMResult result) { if (result.Clip == null) { return; } bool needBlend = m_currentClip.IsNull() == false; if (needBlend) { if (result.Clip == m_currentClip.GetAnimationClip()) { return; } AnimationClipPlayable blendOutClip = m_currentClip; m_mixer.DisconnectInput(0); m_mixer.DisconnectInput(1); m_mixer.ConnectInput(1, blendOutClip, 0, 1.0f); m_weight = 0.0f; m_mixer.SetInputWeight(0, 0.0f); m_mixer.SetInputWeight(1, 1.0f); } else { m_mixer.SetInputWeight(0, 1.0f); m_mixer.SetInputWeight(1, 0.0f); } m_currentClip = AnimationClipPlayable.Create(m_graph, result.Clip); m_currentClip.SetTime(result.Time); m_mixer.DisconnectInput(0); m_mixer.ConnectInput(0, m_currentClip, 0, needBlend? 0.0f : 1.0f); }
internal virtual ABaseMode ReactionKeyBase(Keys Key) { JumpCounter = 0; ResultObject = this; FResult = MMResult.None; OnReactionKey(Key); return ResultObject; }
/// <summary> /// Trys a WaveOut operation. /// </summary> /// <param name="result">The Result.</param> public static void Try(MMResult result) { if (result != (int) MMResult.MMSYSERR_NOERROR) { if (result == MMResult.WAVERR_STILLPLAYING) return; throw new InvalidOperationException((result).ToString()); } }
/// <summary> /// Sets the Volume. /// </summary> /// <param name="waveOut">The WaveOut.</param> /// <param name="left">The Left.</param> /// <param name="right">The Right.</param> public static void SetVolume(IntPtr waveOut, float left, float right) { uint tmp = (uint)(left * 0xFFFF) + ((uint)(right * 0xFFFF) << 16); MMResult result = MMInterops.waveOutSetVolume(waveOut, tmp); if (result != MMResult.MMSYSERR_NOERROR) { WaveOutResult.Try(MMInterops.waveOutSetVolume(waveOut, tmp)); } }
/// <summary> /// Trys a WaveOut operation. /// </summary> /// <param name="result">The Result.</param> public static void Try(MMResult result) { if (result != (int)MMResult.MMSYSERR_NOERROR) { if (result == MMResult.WAVERR_STILLPLAYING) { return; } throw new InvalidOperationException((result).ToString()); } }
/// <summary> /// Stops the wavestream. /// </summary> public void Stop() { if (_playbackState != PlaybackState.Stopped) { _playbackState = PlaybackState.Stopped; lock (_lockObj) { MMResult result = MMInterops.waveOutReset(WaveOutHandle); WaveOutResult.Try(result); } RaisePlaybackChanged(); } }
} // ReactionKey private bool Init(ABaseMode NewMode) { NewMode.Const = Const; NewMode = NewMode.Init(); MMResult Result = NewMode.Result; if (Result == MMResult.Positive) { MM = NewMode; } FCurrentMode = MM.CurrentMode; Const = MM.Const; //Временно, рефрешим константы FEmployer = MM.Employer; //Временно return(Result == MMResult.Positive ? true : false); } // Init
public override void Write(byte[] buffer, int offset, int count) { do { int cb = 0; int bufferSize = hdr1.cbSrcLength; if (ptrBuffer1 == hdr1.cbSrcLength || count == 0) { if (count == 0) { hdr1.cbSrcLength = ptrBuffer1; } AcmStreamConvertFlags flags; flags = AcmStreamConvertFlags.BLOCKALIGN; if (firstBlock) { flags = AcmStreamConvertFlags.START; firstBlock = false; } else if (count != 0 || ptrBuffer1 > 0) { flags = AcmStreamConvertFlags.BLOCKALIGN; } else { flags = AcmStreamConvertFlags.END; } MMResult mmr = AcmNativeMethods.acmStreamConvert(hStreamComp, ref hdr1, flags); ptrBuffer1 = 0; hdr1.cbSrcLength = bufferSize; base.Write(outBuffer1, 0, hdr1.cbDstLengthUsed); } cb = Math.Min(hdr1.cbSrcLength - ptrBuffer1, count); Array.Copy(buffer, offset, inBuffer1, ptrBuffer1, cb); count -= cb; ptrBuffer1 += cb; offset += cb; } while (count > 0); }
private void callbackWaveIn(IntPtr deviceHandle, uint message, IntPtr instance, ref WaveHeader waveHeader, IntPtr reserved2) { if (message == MM_WIM_DATA) { if (waveHeader.bytesRecorded > 0) { int numberOfBytesRecorded = waveHeader.bytesRecorded; if (numberOfBytesRecorded > 0) { Monitor.Enter(lockObject); // This does not seem to help.. still get access violations when accessing the data. byte[] newSoundData = new byte[numberOfBytesRecorded]; Marshal.Copy(waveHeader.dataPointer, newSoundData, 0, numberOfBytesRecorded); totalNumberOfBytesRecorded += numberOfBytesRecorded; timeRecordingList.Add(new Tuple <int, DateTime, byte[]>(recordingIndex, DateTime.Now, newSoundData)); if (timeRecordingList.Count > storageCount) { timeRecordingList.RemoveAt(0); } recordingIndex++; Monitor.Exit(lockObject); GC.Collect(); // This IS ugly, but it appears to work ... } } MMResult i = waveInUnprepareHeader(waveHandle, ref waveHeader, Convert.ToUInt32(Marshal.SizeOf(waveHeader))); if (i != MMResult.MMSYSERR_NOERROR) { } SetupBuffer(); } else if (message == MM_WIM_CLOSE) { } else { } }
protected override void LoadHeader() { base.LoadHeader(); byte[] fmtIn = _fmt.GetBytes(); if (_fmt2 == null) { _fmt2 = WaveFormat2.GetPCMWaveFormat(_fmt.SamplesPerSec, _fmt.Channels, _fmt.BitsPerSample != 0 ? _fmt.BitsPerSample : (short)16); } byte[] fmtOut = _fmt2.GetBytes(); MMResult mmr; _fmt2 = new WaveFormat2(fmtOut); mmr = AcmNativeMethods.acmStreamOpen(out hStreamComp, IntPtr.Zero, fmtIn, fmtOut, IntPtr.Zero, 0, 0, AcmStreamOpenFlags.CALLBACK_NULL); hdr1 = new ACMSTREAMHEADER(); hdr1.cbStruct = Marshal.SizeOf(hdr1); hdr2 = new ACMSTREAMHEADER(); hdr2.cbStruct = Marshal.SizeOf(hdr2); int cbIn = (_fmt.AvgBytesPerSec * DefaultBufferSizeInSeconds / _fmt.BlockAlign + 1) * _fmt.BlockAlign; inBuffer1 = new byte[cbIn]; inBuffer2 = new byte[cbIn]; int cbOut = _fmt2.BlockAlign * _fmt2.AvgBytesPerSec * DefaultBufferSizeInSeconds; mmr = AcmNativeMethods.acmStreamSize(hStreamComp, cbIn, out cbOut, AcmStreamSizeFlags.SOURCE); outBuffer1 = new byte[cbOut]; outBuffer2 = new byte[cbOut]; hinBuffer1 = GCHandle.Alloc(inBuffer1, GCHandleType.Pinned); houtBuffer1 = GCHandle.Alloc(outBuffer1, GCHandleType.Pinned); hinBuffer2 = GCHandle.Alloc(inBuffer2, GCHandleType.Pinned); houtBuffer2 = GCHandle.Alloc(outBuffer2, GCHandleType.Pinned); hdr1.pbSrc = hinBuffer1.AddrOfPinnedObject(); hdr1.pbDst = houtBuffer1.AddrOfPinnedObject(); hdr1.cbSrcLength = cbIn; hdr1.cbDstLength = cbOut; hdr2.pbSrc = hinBuffer2.AddrOfPinnedObject(); hdr2.pbDst = houtBuffer2.AddrOfPinnedObject(); hdr2.cbSrcLength = cbIn; hdr2.cbDstLength = cbOut; ptrBuffer1 = ptrBuffer1 = 0; bufferRead = new SlidingBuffer(cbOut); firstBlock = true; bufferRead.BufferStarving = (BufferStarvingHandler) delegate(SlidingBuffer obj, int spaceAvailable) { if (hdr1.cbDstLengthUsed == ptrBuffer1) { int cb = ReadInternal(inBuffer1, 0, inBuffer1.Length); if (cb == 0) { return(0); } ptrBuffer1 = 0; AcmStreamConvertFlags flags; if (firstBlock) { flags = AcmStreamConvertFlags.START; firstBlock = false; } else if (cb == inBuffer1.Length) { flags = AcmStreamConvertFlags.BLOCKALIGN; } else { flags = AcmStreamConvertFlags.END; } hdr1.cbSrcLength = cb; MMResult res = AcmNativeMethods.acmStreamConvert(hStreamComp, ref hdr1, flags); return(cb); } int written = obj.Append(outBuffer1, ptrBuffer1, hdr1.cbDstLengthUsed - ptrBuffer1); ptrBuffer1 += written; return(written); }; mmr = AcmNativeMethods.acmStreamPrepareHeader(hStreamComp, ref hdr1, 0); mmr = AcmNativeMethods.acmStreamPrepareHeader(hStreamComp, ref hdr2, 0); }
protected ABaseMode Positive() { ResultObject = this; FResult = MMResult.Positive; return ResultObject; }
protected ABaseMode Negative() { ResultObject = this; FResult = MMResult.Negative; return ResultObject; }
/// <summary> /// Сделана для предотвращения ошибок, типа если забудешь присвоить ResultObject результатом Init() /// </summary> /// <param name="ToMode"></param> /// <returns></returns> protected ABaseMode JumpTo(ABaseMode ToMode) { ResultObject = ToMode.Init(); FResult = ResultObject.Result; return ResultObject; }
internal virtual ABaseMode ReactionBarcodeBase(string Barcode) { JumpCounter = 0; FResult = MMResult.None; ResultObject = this; ThereHandler = false; Dictionary<string, string> dicBarcode = Helper.DisassembleBarcode(Barcode); bool IsRef = false; bool IsObject = false; //Это реально существующий объект //Это может быть справочник! ARef Ref = null; if (Barcode.Substring(0, 2) == "25" && dicBarcode["Type"] == "113") { Ref = new RefEmployer(SS); if (Ref.FoundIDD(dicBarcode["IDD"])) { IsRef = true; OnReactionSCEmployers(Ref as RefEmployer); } if (!IsRef) { Ref = new RefSection(SS); if (Ref.FoundIDD(dicBarcode["IDD"])) { IsRef = true; OnReactionSCSection(Ref as RefSection); } } if (!IsRef) { Ref = new RefPrinter(SS); if (Ref.FoundIDD(dicBarcode["IDD"])) { IsRef = true; OnReactionSCPrinter(Ref as RefPrinter); } } } else if (dicBarcode["Type"] == "6") { Ref = new RefBox(SS); if (Ref.FoundID(dicBarcode["ID"])) { IsRef = true; OnReactionSCBox(Ref as RefBox); } } else if (Barcode.Substring(0, 2) == "26" && dicBarcode["Type"] == "113") { Doc Doc = new Doc(SS); if (Doc.FoundIDD(dicBarcode["IDD"])) { IsObject = true; OnReactionDoc(Doc); } } else if (dicBarcode["Type"] == "pallete") { //ВОТ ЭТА ХУЕТА НИ КАК НЕ УЧИТЫВАЕТСЯ (КАК ОБЪЕКТ, ВСМЫСЛЕ) // ТАК ЧТО ПОТЕНЦИАЛЬНО МОГУТ БЫТЬ ПРОБЛЕМЫ НА ВСЯКИЙ СЛУЧАЙ ВЗВОДИМ ФЛАГ IsObject = true; //OnReactionPallete(Convert.ToInt32(dicBarcode["pallete"])); OnReactionPallete(Barcode); } IsObject = IsRef ? true : IsObject; //Если это справочник, то полюбому объект if (!IsObject) { //Товаром он может быть при любом раскладе, так что если не определился как объект, то будем искать товар Ref = new RefItem(SS); if ((Ref as RefItem).FoundBarcode(Barcode)) { { IsRef = true; OnReactionSCItem(new ReactionSCEventArgs(Barcode, Ref)); } } } if (IsRef) { //Вверху обрабатывали только справочники и в какой-то из них попали OnReactionSC(new ReactionSCEventArgs(Barcode, Ref)); } OnReactionBarcode(Barcode); // просто реакция на штрихкод if (!ThereHandler) { //никакой обработчик не сработал! Отобъем исходя из настроек по умолчанию FExcStr = "Нет действий с этим ШК в данном режиме!"; FResult = MMResult.Negative; } return ResultObject; }