public void recordEnd() { if (recordStartPar == null) return; try { trace("recordEnd, begin"); LMMedia.Recorder.RecordEnd(); if (recordStartPar.toDisc) { //zapis na disk //if (recordStartPar.slOldBrowser) //ukonceni uploadu PCM na disk a vyvolani server side MP3 komprese // recordStartPar.toDiscLib.Dispose(); //else onPCMData(true); } else { //nahravka je v recorded LMMedia.WaveFormatExtensible.WriteHeaderEnd(recordedStream); } recordStartPar = null; trace("recordEnd, end"); } catch (Exception exp) { error("recordEnd", exp); } }
public void recordStart(ScriptObject so) { try { trace("recordStart begin"); player.Stop(); url = null; recordStartPar = new RecordStartPar { toDisc = (bool)so.GetProperty("toDisc"), //slOldBrowser = (bool)so.GetProperty("slOldBrowser"), toDiscFileUrl = (string)so.GetProperty("toDiscFileUrl"), }; recordedBytes = 0; //if (recordStartPar.slOldBrowser && recordStartPar.toDisc) recordStartPar.toDiscLib = new uploadChunk.lib(null, () => Recorder.audioFormat, recordStartPar.toDiscFileUrl); if (recordedStream == null) recordedStream = new MemoryStream(); else recordedStream.SetLength(0); LMMedia.Recorder.RecordStart(recordStartPar, buf => { recordedBytes += buf.Length; if (OnRecordedMilisecs != null) Deployment.Current.Dispatcher.BeginInvoke(() => OnRecordedMilisecs(null, new NumberEventArgument { Value = (int)((long)8 * 1000 * recordedBytes / Recorder.audioFormat.SamplesPerSecond / Recorder.audioFormat.BitsPerSample) })); if (recordStartPar.toDisc) { //zapis na disk //if (recordStartPar.slOldBrowser) { //stary browser uploaduje na disk PCM data a po ukonceni provede MP3 kompresi // recordStartPar.toDiscLib.uploadChunk(buf); //} else { //novy browser posle PCM do JS, kde se vse zpravuje podobne, jako pro Chrome nebo FF if (recordedStream.Position == 0) { var wr = new BinaryWriter(recordedStream); wr.Write((UInt16)Recorder.audioFormat.SamplesPerSecond); wr.Write((UInt16)Recorder.audioFormat.BitsPerSample); wr.Write((UInt16)Recorder.audioFormat.Channels); } recordedStream.Write(buf, 0, buf.Length); //var dump = buf.Take(10).Select(b => b.ToString()).Aggregate((r, i) => r + "," + i); Deployment.Current.Dispatcher.BeginInvoke(() => onPCMData(false)); //XXX //trace("recordStart data " + buf.Take(10).Select(b => b.ToString()).Aggregate((r, i) => r + "," + i)); //UInt16[] pcm = new UInt16[buf.Length / 2]; //for (var i = 0; i < pcm.Length; i++) pcm[i] = BitConverter.ToUInt16(buf, i * 2); //swap double bytes //var bytes = buf.Select(b => Convert.ToChar(b)).ToArray(); //for (var i = 0; i < bytes.Length / 2; i++) { // var b = bytes[i * 2]; bytes[i * 2] = bytes[i * 2 + 1]; bytes[i * 2 + 1] = b; //} //var str = new string(bytes); // OnPCMData(null, new PCMEventArgument { // //Value = new List<byte>(buf), // //Value = ByteArrayToHex(buf), // BitsPerSample = Recorder.audioFormat.BitsPerSample, // SamplesPerSecond = Recorder.audioFormat.SamplesPerSecond // }); //}); //} } else { //zapis do pameti if (recordedStream.Position == 0) LMMedia.WaveFormatExtensible.WriteHeaderStart(recordedStream, Recorder.audioFormat); recordedStream.Write(buf, 0, buf.Length); } }); trace("recordStart end"); } catch (Exception exp) { error("recordStart", exp); } }