Esempio n. 1
0
    static ShazamResult CaptureAndTag()
    {
        var analysis = new Analysis();
        var finder   = new LandmarkFinder(analysis);

        using (var capture = new WasapiCapture()) {
            var captureBuf = new BufferedWaveProvider(capture.WaveFormat)
            {
                ReadFully = false
            };

            capture.DataAvailable += (s, e) => {
                captureBuf.AddSamples(e.Buffer, 0, e.BytesRecorded);
            };

            capture.StartRecording();

            using (var resampler = new MediaFoundationResampler(captureBuf, new WaveFormat(Analysis.SAMPLE_RATE, 16, 1))) {
                var sampleProvider = resampler.ToSampleProvider();
                var retryMs        = 3000;
                var tagId          = Guid.NewGuid().ToString();

                while (true)
                {
                    while (captureBuf.BufferedDuration.TotalSeconds < 1)
                    {
                        Thread.Sleep(100);
                    }

                    analysis.ReadChunk(sampleProvider);

                    if (analysis.StripeCount > 2 * LandmarkFinder.RADIUS_TIME)
                    {
                        finder.Find(analysis.StripeCount - LandmarkFinder.RADIUS_TIME - 1);
                    }

                    if (analysis.ProcessedMs >= retryMs)
                    {
                        //new Painter(analysis, finder).Paint("c:/temp/spectro.png");
                        //new Synthback(analysis, finder).Synth("c:/temp/synthback.raw");

                        var sigBytes = Sig.Write(Analysis.SAMPLE_RATE, analysis.ProcessedSamples, finder);
                        var result   = ShazamApi.SendRequest(tagId, analysis.ProcessedMs, sigBytes).GetAwaiter().GetResult();
                        if (result.Success)
                        {
                            return(result);
                        }

                        retryMs = result.RetryMs;
                        if (retryMs == 0)
                        {
                            return(result);
                        }
                    }
                }
            }
        }
    }
Esempio n. 2
0
        private void writeObjects(Stream writer)
        {
            int count = _xref.Entries.Count;

            byte[]         endObj = System.Text.Encoding.ASCII.GetBytes("\nendobj\n");
            SaveParameters param  = new SaveParameters();

            param.Stream = writer;
            param.WriteInheritableObjects = false;
            param.Buffer       = new MemoryStream(4096);
            param.StringBuffer = new MemoryStream(1024);
            param.Compression  = _compression;
            param.Encryptor    = _xref.Encryptor;
            if (_xref.Encryptor != null)
            {
                count--;
            }

            for (int i = 1; i < count; ++i)
            {
                Entry entry = _xref.Entries[i];
                entry.Offset = (int)writer.Position;

                string startObj = i.ToString() + " 0 obj\n";
                writer.Write(System.Text.Encoding.ASCII.GetBytes(startObj), 0, startObj.Length);
                param.ObjNo = i;

                // Если словарь подписи, то находим запись ByteRange и ее офсет
                if (entry.Object.ObjNo == _signature)
                {
                    _byteRangeOffset = Sig.Write(param, entry.Object as PDFDictionary, out _byteRange);
                }
                else
                {
                    entry.Object.Write(param);
                }

                writer.Write(endObj, 0, endObj.Length);
            }

            if (_xref.Encryptor != null)
            {
                param.Encryptor = null;
                param.WriteInheritableObjects = true;
                Entry entry = _xref.Entries[count];
                entry.Offset = (int)writer.Position;
                string startObj = count.ToString() + " 0 obj\n";
                writer.Write(System.Text.Encoding.ASCII.GetBytes(startObj), 0, startObj.Length);
                entry.Object.Write(param);
                writer.Write(endObj, 0, endObj.Length);
            }

            param.Buffer.Dispose();
            param.StringBuffer.Dispose();
        }