Beispiel #1
0
        //WriteFloatingRIFF
        //  Subroutine to Write a RIFF waveform to a memory Stream (no disc access)
        public bool WriteRIFFStream(ref MemoryStream WaveStream, int intSampleRate, int intFmtChunkLength, ref byte[] aryWaveData)
        {
            //*************************************************************************
            //	Here is where the file will be created. A
            //	wave file is a RIFF file, which has chunks
            //	of data that describe what the file contains.
            //	A wave RIFF file is put together like this:
            //	The 12 byte RIFF chunk is constructed like this:
            //     Bytes(0 - 3) 'R' 'I' 'F' 'F'
            //	   Bytes 4 - 7 :	Length of file, minus the first 8 bytes of the RIFF description.
            //					(4 bytes for "WAVE" + 24 bytes for format chunk length +
            //					8 bytes for data chunk description + actual sample data size.)
            //     Bytes(8 - 11) 'W' 'A' 'V' 'E'
            //	The 24 byte FORMAT chunk is constructed like this:
            //     Bytes(0 - 3) 'f' 'm' 't' ' '
            //	   Bytes 4 - 7 :	The format chunk length. This is 16 or 18
            //	   Bytes 8 - 9 :	File padding. Always 1.
            //	   Bytes 10- 11:	Number of channels. Either 1 for mono,  or 2 for stereo.
            //	   Bytes 12- 15:	Sample rate.
            //	   Bytes 16- 19:	Number of bytes per second.
            //	   Bytes 20- 21:	Bytes per sample. 1 for 8 bit mono, 2 for 8 bit stereo or
            //					16 bit mono, 4 for 16 bit stereo.
            //	   Bytes 22- 23:	Number of bits per sample.
            //	The DATA chunk is constructed like this:
            //     Bytes(0 - 3) 'd' 'a' 't' 'a'
            //	   Bytes 4 - 7 :	Length of data, in bytes.
            //	   Bytes 8 -...:	Actual sample data.
            //**************************************************************************
            //TODO: Test of "back porch" extension for PTT
            //ReDim Preserve aryWaveData(aryWaveData.Length + 1023) ' Adds 42.6 ms additional dead time before removal of PTT
            byte[] bytTemp = new byte[-1 + 1];
            if (intFmtChunkLength == 16)
            {
                if ((WaveStream != null))
                {
                    WaveStream.Flush();
                }
                WaveStream = new MemoryStream(43 + aryWaveData.Length);
            }
            else if (intFmtChunkLength == 18)
            {
                if ((WaveStream != null))
                {
                    WaveStream.Flush();
                }
                WaveStream = new MemoryStream(45 + aryWaveData.Length);
            }
            else
            {
                return(false);
            }

            // Set up file with RIFF chunk info.
            short shPad = 1;
            // File padding
            int intLength = 0;

            if (intFmtChunkLength == 16)
            {
                intLength = aryWaveData.Length + 36;
                // File length, minus first 8 bytes of RIFF description.
            }
            else if (intFmtChunkLength == 18)
            {
                intLength = aryWaveData.Length + 38;
                // File length, minus first 8 bytes of RIFF description.
            }
            short shBytesPerSample = 2;

            // Bytes per sample.

            // Fill in the riff info for the wave file.
            AppendBytes(ref bytTemp, Globals.GetBytes("RIFF"));
            AppendBytes(ref bytTemp, Int32ToBytes(intLength));
            AppendBytes(ref bytTemp, Globals.GetBytes("WAVE"));
            AppendBytes(ref bytTemp, Globals.GetBytes("fmt "));
            AppendBytes(ref bytTemp, Int32ToBytes(intFmtChunkLength));
            AppendBytes(ref bytTemp, Int16ToBytes(shPad));
            AppendBytes(ref bytTemp, Int16ToBytes(1));
            // mono
            AppendBytes(ref bytTemp, Int32ToBytes(intSampleRate));
            AppendBytes(ref bytTemp, Int32ToBytes(2 * intSampleRate));
            AppendBytes(ref bytTemp, Int16ToBytes(2));
            // bytes/sample
            if (intFmtChunkLength == 18)
            {
                AppendBytes(ref bytTemp, Int16ToBytes(2));
                // bytes/sample
            }
            AppendBytes(ref bytTemp, Int16ToBytes(16));
            // bits/sample
            // DateTime.Now fill in the data chunk.
            AppendBytes(ref bytTemp, Globals.GetBytes("data"));
            AppendBytes(ref bytTemp, Int32ToBytes(aryWaveData.Length));
            AppendBytes(ref bytTemp, aryWaveData);
            WaveStream.Write(bytTemp, 0, bytTemp.Length);
            return(true);
        }
        public void Download(string message, BaiHat baiHat, bool isUser)
        {
            string fileId          = baiHat.link;
            string ApplicationName = "Drive API .NET Quickstart";

            string[] scopes = new string[] { DriveService.Scope.Drive,
                                             DriveService.Scope.DriveFile };
            var clientId     = "843374652518-0dlrtbe20h90du34vj6k30tnt0p5tism.apps.googleusercontent.com";
            var clientSecret = "2JsXDylX8KqcwebMYnKW_aXU";
            var credential   = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets
            {
                ClientId     = clientId,
                ClientSecret = clientSecret
            },
                                                                           scopes,
                                                                           Environment.UserName,
                                                                           CancellationToken.None,
                                                                           new FileDataStore("MyAppsToken")).Result;
            DriveService service = new DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName       = ApplicationName,
            });

            service.HttpClient.Timeout = TimeSpan.FromMinutes(100);

            var request = service.Files.Get(fileId);
            var stream1 = new System.IO.MemoryStream();

            request.MediaDownloader.ProgressChanged +=
                (IDownloadProgress progress) =>
            {
                switch (progress.Status)
                {
                case DownloadStatus.Downloading:
                {
                    Console.WriteLine(progress.BytesDownloaded);
                    break;
                }

                case DownloadStatus.Completed:
                {
                    Console.WriteLine("Download complete.");
                    break;
                }

                case DownloadStatus.Failed:
                {
                    Console.WriteLine("Download failed.");
                    break;
                }
                }
            };
            request.Download(stream1);
            if (isUser == true)
            {
                WaveStream wave = new WaveStream(stream1);
                wave.Flush();
                MemoryStream tam = Hide(message, wave);
                using (FileStream f = new FileStream(Server.MapPath("~/Music/" + baiHat.MaBaiHat + ".wav"), FileMode.Create, FileAccess.Write))
                {
                    tam.WriteTo(f);
                    f.Flush();
                }
            }
            else
            {
                using (FileStream f = new FileStream(Server.MapPath("~/Music/" + baiHat.MaBaiHat + ".wav"), FileMode.Create, FileAccess.Write))
                {
                    stream1.WriteTo(f);
                }
            }
        }