/// <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); } }
/// <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; }
/// <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(); } }
/// <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(); } } }