NScumm.Scumm.Audio.IMuse.IMuseInternal.ReallocateMidiChannels C# (CSharp) Method

ReallocateMidiChannels() protected method

protected ReallocateMidiChannels ( MidiDriver midi ) : void
midi NScumm.Core.Audio.MidiDriver
return void
        internal protected void ReallocateMidiChannels(MidiDriver midi)
        {
            Part part, hipart;
            byte hipri, lopri;

            while (true)
            {
                hipri = 0;
                hipart = null;
                for (var i = 0; i < 32; i++)
                {
                    part = _parts[i];
                    if (part.Player != null && part.Player.MidiDriver == midi &&
                        !part.Percussion && part.On &&
                        part.MidiChannel == null && part.PriorityEffective >= hipri)
                    {
                        hipri = (byte)part.PriorityEffective;
                        hipart = part;
                    }
                }

                if (hipart == null)
                    return;

                if ((hipart.MidiChannel = midi.AllocateChannel()) == null)
                {
                    lopri = 255;
                    Part lopart = null;
                    for (var i = 0; i < 32; i++)
                    {
                        part = _parts[i];
                        if (part.MidiChannel != null && part.MidiChannel.Device == midi && part.PriorityEffective <= lopri)
                        {
                            lopri = (byte)part.PriorityEffective;
                            lopart = part;
                        }
                    }

                    if (lopart == null || lopri >= hipri)
                        return;
                    lopart.Off();

                    if ((hipart.MidiChannel = midi.AllocateChannel()) == null)
                        return;
                }
                hipart.SendAll();
            }
        }