Esempio n. 1
0
        IEnumerable<AudioChunk> StreamDataCore( AiffChunkHeader chunk, PrimitiveReader reader )
        {
            int offset = reader.ReadInt32();
            int blockSize = reader.ReadInt32();

            long length = (uint)chunk.DataSize - 8; // Signed number to unsigned number.
            int bufferLength = bufferSize; // Approximately one second each.
            while( length > 0 ) {
                int currentBufferSize = (int)Math.Min( bufferLength, length );
                byte[] data = reader.ReadBytes( currentBufferSize );
                info.Data = transformer.Transform( data, actualBitsPerSample );
                length -= bufferLength;
                yield return info;
            }
        }
Esempio n. 2
0
        void ProcessCommonChunk( AiffChunkHeader chunk, PrimitiveReader reader )
        {
            byte[] chunkData = reader.ReadBytes( chunk.DataSize );
            Stream source = reader.stream;
            reader.stream = new MemoryStream( chunkData );
            int channelsCount = reader.ReadInt16();
            uint frameCount = reader.ReadUInt32();
            int bitsPerSample = reader.ReadInt16();
            byte[] sampleRateBytes = reader.ReadBytes( 10 );
            double sampleRate = ConvertFromIeeeExtended( sampleRateBytes );
            Console.WriteLine( sampleRate );

            AppendInfoLine( 2, "Channels Count: {0}", channelsCount );
            AppendInfoLine( 2, "Sample rate (frames/sec): {0}", sampleRate );
            AppendInfoLine( 2, "Bits per sample: {0}", bitsPerSample );
            AppendInfoLine( 2, "Frame count: {0}", frameCount );

            int byteRate = (int)Math.Ceiling( sampleRate ) * channelsCount * bitsPerSample / 8;
            info.Frequency = (int)sampleRate;
            Console.WriteLine( "BPS:" + bitsPerSample + ", SR:" + info.Frequency );

            transformer = EmptyTransformer.Instance;
            if( bitsPerSample > 8 && bitsPerSample <= 16 ) {
                transformer = BigEndian16BitTo16BitTransformer.Instance;
            }
            if( bitsPerSample > 16 && bitsPerSample <= 24 ) {
                transformer = BigEndian24BitTo16BitTransformer.Instance;
            }
            // Number of bytes that make up a second's worth of audio data.
            bufferSize = byteRate;
            info.Channels = channelsCount;
            actualBitsPerSample = bitsPerSample;
            // TODO: Remove this hackery.
            if( bitsPerSample > 16 )
                bitsPerSample = 16;
            info.BitsPerSample = bitsPerSample;
            if( aifcFormat ) {
                string compressionType = reader.ReadASCIIString( 4 );
                string compressionName = reader.ReadASCIIString( reader.ReadByte() );
                AppendInfoLine( 2, "Compression type: {0}", compressionType );
                AppendInfoLine( 2, "Compression name: {0}", compressionName );
                switch( compressionType ) {
                    case "NONE":
                    case "sowt":
                        break;

                    case "alaw":
                    case "ALAW":
                        info.BitsPerSample = 16;
                        transformer = ALawTransformer.Instance;
                        break;

                    case "ulaw":
                    case "ULAW":
                        info.BitsPerSample = 16;
                        transformer = MuLawTransformer.Instance;
                        break;
                }
            }
            reader.stream = source;
        }
Esempio n. 3
0
 void ProcessFormatVersionChunk( AiffChunkHeader chunk, PrimitiveReader reader )
 {
     uint timeStamp = reader.ReadUInt32();
     AppendInfoLine( 2, "Format timestamp: {0} (hex {1})", timeStamp, timeStamp.ToString( "X8" ) );
 }
Esempio n. 4
0
 static AiffChunkHeader ReadChunkHeader( PrimitiveReader reader )
 {
     AiffChunkHeader chunk = new AiffChunkHeader();
     chunk.Signature = reader.ReadASCIIString( 4 );
     chunk.DataSize = reader.ReadInt32();
     return chunk;
 }