public AudioEncoder ScheduleEncode(Audio audio) { AudioEncoder encoder = null; lock (instanceLock) { lock (instanceLock) { if (!runningEncoders.ContainsKey(audio.node.id)) { encoder = new AudioEncoder(this, audio); LongTask task = new LongTask(() => { encoder.Run(); lock (instanceLock) { runningEncoders.Remove(encoder.Audio.node.id); runningEncodersById.Remove(encoder.Id); } }, audio.node.owner, $"Build MP3 for '{audio.node.name}' (id: {audio.node.id})"); scheduler.Start(task); runningEncoders[audio.node.id] = encoder; runningEncodersById[encoder.Id] = encoder; } else { encoder = runningEncoders[audio.node.id]; } } } return(encoder); }
public AudioEncoderService(PriorityTaskScheduler scheduler) { this.scheduler = scheduler; Get["/{id}"] = (p, c) => { var id = (string)p["id"]; AudioEncoder encoder = null; lock (instanceLock) { if (runningEncodersById.ContainsKey(id)) { encoder = runningEncodersById[id]; } } if (encoder != null) { c.Response.StatusCode = 200; c.Response.Content = encoder.ToJson(); } }; PostAsync["/{id}/progress"] = async(p, c) => { var values = new Dictionary <string, string>(); string id = (string)p["id"]; AudioEncoder encoder = null; lock (instanceLock) { if (runningEncodersById.ContainsKey(id)) { encoder = runningEncodersById[id]; } } if (encoder == null) { return; } using (StreamReader sr = new StreamReader(c.Request.InputStream)) { var end = false; while (!sr.EndOfStream && !end) { var line = await sr.ReadLineAsync(); var pos = line.IndexOf('='); if (pos > 0) { var cmd = line.Substring(0, pos); var value = line.Substring(pos + 1); if (cmd == "progress") { end |= value == "end"; // get the total micro secondes position in the audio if (values.ContainsKey("out_time_ms") && long.TryParse(values["out_time_ms"], out long outTimeMs)) { encoder.TimeProgress = ((double)outTimeMs) / 1000000.0d; } // get current frame position in the audio if (values.ContainsKey("frame") && long.TryParse(values["frame"], out long frame)) { encoder.Frame = frame; } values.Clear(); } else { values[cmd] = value; } } } } }; }