public Effect Load(IEffectPartInfo info) { var sound = (SoundEffectPartInfo)info; return(entity => { entity.CreateComponentIfNotExists <SoundComponent>(); SoundMessage msg = new SoundMessage(entity, sound.Name, sound.Playing); entity.SendMessage(msg); }); }
public Effect Load(IEffectPartInfo info) { var sound = (SoundEffectPartInfo)info; return entity => { entity.CreateComponentIfNotExists<SoundComponent>(); SoundMessage msg = new SoundMessage(entity, sound.Name, sound.Playing); entity.SendMessage(msg); }; }
/// <summary> /// Добавить сообщение в очередь. /// </summary> /// <param name="aMessage">Сообщение.</param> public void InsertMessage(SoundMessage aMessage) { if (aMessage.GetPriority() > maxPriority) { throw new ArgumentOutOfRangeException(string.Format("Priority must be less than {0}.", maxPriority)); } lock (queueLock) { messageList.Add(aMessage); messageList.Sort(Comparer); } }
/// <summary> /// Добавить элемент в очередь. /// Сортируя по 2-ум приоритетам. /// </summary> public void AddItem(SoundMessage item) { if (item == null) { return; } //делать сортировку по приоритету. if (item.PriorityMain == Priority.Low) { Queue.Enqueue(item); } else { if (!Queue.Any()) { Queue.Enqueue(item); return; } //сохранили 1-ый элемент, и удаили его var currentFirstItem = Queue.FirstOrDefault(); SoundMessage outItem; Queue.TryDequeue(out outItem); //??? //добавили новый элемент и отсортировали. Queue.Enqueue(item); var ordered = Queue.OrderByDescending(elem => elem.PriorityMain).ThenByDescending(elem => elem.PrioritySecondary).ToList(); //ThenByDescending(s=>s.) упорядочевать дополнительно по времени добавления //Очистили и заполнили заново очередь Queue = new ConcurrentQueue <SoundMessage>(); if (currentFirstItem != null) { Queue.Enqueue(currentFirstItem); } foreach (var elem in ordered) { Queue.Enqueue(elem); } } }
/// <summary> /// Положить новое звуковое сообщение в потокобезопасную очередь с приоритетами. /// </summary> /// <param name="aMessage">Сообщение.</param> public void InsertMessage(SoundMessage aMessage) { soundsQueue.InsertMessage(aMessage); }
/// <summary> /// Заканчивает запись звука на канале. /// </summary> /// <param name="aChannelNumber">Идентификатор канала.</param> /// <param name="aRecordOwner">Инициатор записи.</param> public void StopRecord(int aChannelNumber, int aRecordOwner) { lock (stopRecordLock) { if (!isBusy) { return; } if (aRecordOwner != currentRecordOwner) { return; } if (Thread.CurrentThread != recordControlThread) { recordControlThread.Abort(); } currentRecordOwner = -1; isBusy = false; NativeMethods.waveInReset(handle); if (currentWaveInHdr.DwBytesRecorded == 0) { return; } var buffer = new byte[currentWaveInHdr.DwBytesRecorded]; Marshal.Copy(currentWaveInHdr.LpData, buffer, 0, buffer.Length); Marshal.FreeHGlobal(currentWaveInHdr.LpData); currentWaveInHdr.DwBytesRecorded = 0; var outChannelsIds = new int[currentOutChannelsIds.Length]; currentOutChannelsIds.CopyTo(outChannelsIds, 0); CopySoundOnAllChannels(buffer, aChannelNumber); if (callback != null) { var message = new SoundMessage(buffer, 255); foreach (var channelId in outChannelsIds) { callback.ProcessMessage(message, channelId); } } } }
/// <summary> /// Сортируем так, чтобы сообщения с высоким приоритетом были вначале очереди. /// </summary> /// <param name="aFirst">X.</param> /// <param name="aSecond">Y.</param> /// <returns>Результат сравнения.</returns> private static int Comparer(SoundMessage aFirst, SoundMessage aSecond) { return aFirst.GetPriority() <= aSecond.GetPriority() ? 0 : -1; }