Пример #1
0
 /// <summary>
 /// Adds a encodeJob to the queue.
 /// </summary>
 /// <param name="encodeJob">The encodeJob.</param>
 /// <remarks>Documented by Dev02, 2008-04-14</remarks>
 public void AddJob(EncodeJob job)
 {
     lock (jobQueue)
     {
         jobQueue.Enqueue(job);
         Monitor.Pulse(jobQueue);
     }
 }
Пример #2
0
 /// <summary>
 /// Adds a encodeJob to the queue.
 /// </summary>
 /// <param name="encodeJob">The encodeJob.</param>
 /// <remarks>Documented by Dev02, 2008-04-14</remarks>
 public void AddJob(EncodeJob job)
 {
     lock (jobQueue)
     {
         jobQueue.Enqueue(job);
         Monitor.Pulse(jobQueue);
     }
 }
Пример #3
0
        /// <summary>
        /// The encoding thread.
        /// </summary>
        /// <remarks>Documented by Dev02, 2008-04-14</remarks>
        private void EncodeThread()
        {
            try
            {
                while (true)
                {
                    EncodeJob job = null;

                    lock (jobQueue)
                    {
                        while (jobQueue.Count == 0 && !stopThread)
                        {
                            Monitor.Wait(jobQueue);
                        }
                        if (!stopThread)
                        {
                            job = jobQueue.Dequeue();
                        }
                    }

                    if (stopThread)
                    {
                        break;
                    }

                    if (job != null)
                    {
                        //begin encoding process
                        EncodeMedia(job);
                        job.OnEncodingFinished(new EventArgs());
                    }
                }
            }
            catch (Exception exp)
            {
                if (!(exp is ThreadAbortException))
                {
                    Trace.WriteLine("Encode Thread Exception: " + exp.ToString());
                }
            }
        }
        /// <summary>
        /// Adds the media file to the actual card.
        /// </summary>
        /// <param name="cardIndex">Index of the card.</param>
        /// <param name="path">The path.</param>
        /// <param name="sentence">if set to <c>true</c> the file is the sentence of the actual card.</param>
        /// <param name="side">The side.</param>
        /// <param name="codec">The codec to encode. Null to disable.</param>
        /// <returns></returns>
        /// <remarks>Documented by Dev05, 2007-08-08</remarks>
        public bool AddMediaFile(int cardIndex, string path, bool sentence, Side side, Codec codec, bool showWindow, bool minimizeWindow)
        {
            //add media object
            ICard card = cards[cardIndex];
            IMedia media = card.CreateMedia(EMedia.Audio, path, true, !sentence, sentence);
            card.AddMedia(media, side);

            if (codec != null && codec.CanEncode)
            {
                //create and add background encoding encodeJob
                EncodeJob encodeJob = new EncodeJob(media, card, side, codec);
                encodeJob.EncodingFinished += new EventHandler(encodeJob_EncodingFinished);
                encodeJob.ShowWindow = showWindow;
                encodeJob.MinimizeWindow = minimizeWindow;
                backgroundEncoder.AddJob(encodeJob);
            }
            else
                SaveDictionary();

            return true;
        }
Пример #5
0
        /// <summary>
        /// Encodes the media.
        /// </summary>
        /// <param name="encodeJob">The encodeJob.</param>
        /// <remarks>Documented by Dev02, 2008-04-14</remarks>
        private void EncodeMedia(EncodeJob job)
        {
            FileInfo tempFile = null;
            FileInfo sourceFile = null;

            try
            {
                //check for audio object
                IAudio oldAudio = job.oldMedia as IAudio;
                if (oldAudio == null)
                    return;

                if (!job.codec.CanEncode)
                {
                    Trace.WriteLine("Selected codec is not able to encode: " + job.codec.EncodeError);
                    return;
                }

                //prepare encoding
                sourceFile = new FileInfo(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + job.oldMedia.Extension));

                //write to temp file
                using (Stream mediaStream = job.oldMedia.Stream)
                {
                    using (Stream output = new FileStream(sourceFile.FullName, FileMode.Create))
                    {
                        byte[] buffer = new byte[32 * 1024];
                        int read;

                        while ((read = mediaStream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            output.Write(buffer, 0, read);
                        }
                    }
                }

                tempFile = new FileInfo(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + job.codec.extension));
                if (tempFile.Exists)
                    tempFile.Delete();

                //start encoding
                DateTime startencode = DateTime.Now;
                Trace.WriteLine("Starting encoding of " + sourceFile.Name + " to " + tempFile.Name);
                job.codec.Encode(sourceFile, tempFile, job.ShowWindow, job.MinimizeWindow);
                Trace.WriteLine("Encoding finished, duration " + (DateTime.Now - startencode).ToString());

                //generate and attach new media object
                tempFile.Refresh();
                if (tempFile.Exists)
                {
                    job.newMedia = job.card.CreateMedia(oldAudio.MediaType, tempFile.FullName,
                        oldAudio.Active.HasValue ? oldAudio.Active.Value : false,
                        oldAudio.Default.HasValue ? oldAudio.Default.Value : false,
                        oldAudio.Example.HasValue ? oldAudio.Example.Value : false);
                    job.card.RemoveMedia(job.oldMedia);
                    job.card.AddMedia(job.newMedia, job.side);
                }
                else
                {
                    Trace.WriteLine("Encoded audio file missing: " + tempFile.FullName);
                }
            }
            catch (Exception exp)
            {
                job.exception = exp;
            }
            finally
            {
                if (sourceFile != null && sourceFile.Exists)
                    sourceFile.Delete();
                if (tempFile != null && tempFile.Exists)
                    tempFile.Delete();
            }
        }
Пример #6
0
        /// <summary>
        /// Encodes the media.
        /// </summary>
        /// <param name="encodeJob">The encodeJob.</param>
        /// <remarks>Documented by Dev02, 2008-04-14</remarks>
        private void EncodeMedia(EncodeJob job)
        {
            FileInfo tempFile   = null;
            FileInfo sourceFile = null;

            try
            {
                //check for audio object
                IAudio oldAudio = job.oldMedia as IAudio;
                if (oldAudio == null)
                {
                    return;
                }

                if (!job.codec.CanEncode)
                {
                    Trace.WriteLine("Selected codec is not able to encode: " + job.codec.EncodeError);
                    return;
                }

                //prepare encoding
                sourceFile = new FileInfo(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + job.oldMedia.Extension));

                //write to temp file
                using (Stream mediaStream = job.oldMedia.Stream)
                {
                    using (Stream output = new FileStream(sourceFile.FullName, FileMode.Create))
                    {
                        byte[] buffer = new byte[32 * 1024];
                        int    read;

                        while ((read = mediaStream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            output.Write(buffer, 0, read);
                        }
                    }
                }

                tempFile = new FileInfo(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + job.codec.extension));
                if (tempFile.Exists)
                {
                    tempFile.Delete();
                }

                //start encoding
                DateTime startencode = DateTime.Now;
                Trace.WriteLine("Starting encoding of " + sourceFile.Name + " to " + tempFile.Name);
                job.codec.Encode(sourceFile, tempFile, job.ShowWindow, job.MinimizeWindow);
                Trace.WriteLine("Encoding finished, duration " + (DateTime.Now - startencode).ToString());

                //generate and attach new media object
                tempFile.Refresh();
                if (tempFile.Exists)
                {
                    job.newMedia = job.card.CreateMedia(oldAudio.MediaType, tempFile.FullName,
                                                        oldAudio.Active.HasValue ? oldAudio.Active.Value : false,
                                                        oldAudio.Default.HasValue ? oldAudio.Default.Value : false,
                                                        oldAudio.Example.HasValue ? oldAudio.Example.Value : false);
                    job.card.RemoveMedia(job.oldMedia);
                    job.card.AddMedia(job.newMedia, job.side);
                }
                else
                {
                    Trace.WriteLine("Encoded audio file missing: " + tempFile.FullName);
                }
            }
            catch (Exception exp)
            {
                job.exception = exp;
            }
            finally
            {
                if (sourceFile != null && sourceFile.Exists)
                {
                    sourceFile.Delete();
                }
                if (tempFile != null && tempFile.Exists)
                {
                    tempFile.Delete();
                }
            }
        }