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);
            };
        }
Example #3
0
        /// <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);
            }
        }
Example #4
0
        /// <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);
                }
            }
        }
Example #5
0
 /// <summary>
 /// Положить новое звуковое сообщение в потокобезопасную очередь с приоритетами.
 /// </summary>
 /// <param name="aMessage">Сообщение.</param>
 public void InsertMessage(SoundMessage aMessage)
 {
     soundsQueue.InsertMessage(aMessage);
 }
Example #6
0
        /// <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);
                    }
                }
            }
        }
Example #7
0
 /// <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;
 }