예제 #1
0
파일: Ask.cs 프로젝트: fdsc/old
        public static void SoundSiren(int sirenNumber, int siren, Ask form = null)
        {
            var o = new object();

            System.Threading.ThreadPool.QueueUserWorkItem
            (
                delegate
            {
                System.Windows.Media.MediaPlayer player = new System.Windows.Media.MediaPlayer();
                player.Volume = Form1.opts[Form1.optsName[28], 0] / 100.0;

                bool notWindows = form != null && !(!form.form.notWindows && !form.form.noReaction) ? true : false;
                // var sp = new System.Media.SoundPlayer(s);
                int i = 0;

                if (sirenNumber == 1)
                {
                    player.Open(new Uri("Resources/siren.wav", UriKind.Relative));
                }
                if (sirenNumber == 2)
                {
                    player.Open(new Uri("Resources/sirenimp.wav", UriKind.Relative));
                }

                if (form != null && form.form.shortSiren && siren > Form1.opts[Form1.optsName[33], 0])
                {
                    siren = Form1.opts[Form1.optsName[33], 0];
                }

                while (!player.NaturalDuration.HasTimeSpan)
                {
                    Thread.Sleep(20);
                }

                var ts = player.NaturalDuration.TimeSpan;
                //ts.Subtract(new TimeSpan(0, 0, 0, 0, 1));
                for (; i < siren; i++)
                {
                    if (Program.mainForm.ежимСмотрюФильмВключён() || Program.mainForm.noRelaxTime)
                    {
                        return;
                    }

                    //player.Open(new Uri("Resources/sirenimp.wav", UriKind.Relative));
                    player.Position = new TimeSpan(0);
                    player.Play();

                    lock (o) Monitor.Wait(o, ts.Milliseconds + 1000 * ts.Seconds - 20);

                    while (player.Position < ts)
                    {
                        Thread.Sleep(20);
                    }

                    player.Stop();

                    if (Form1.locked || (form != null && form.isSirenSolutionExist))
                    {
                        for (int j = 0; j < 20; j++)
                        {
                            lock (o) Monitor.Wait(o, 500);
                            if (!(Form1.locked || (form != null && form.isSirenSolutionExist)))
                            {
                                break;
                            }
                        }

                        if (
                            Form1.locked ||
                            (form != null && form.isSirenSolutionExist) ||
                            (notWindows != (form != null && !(!form.form.notWindows && !form.form.noReaction) ? true : false))
                            )
                        {
                            return;
                        }
                    }
                }
            }
            );
        }