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; } }
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; }
void ProcessFormatVersionChunk( AiffChunkHeader chunk, PrimitiveReader reader ) { uint timeStamp = reader.ReadUInt32(); AppendInfoLine( 2, "Format timestamp: {0} (hex {1})", timeStamp, timeStamp.ToString( "X8" ) ); }
static AiffChunkHeader ReadChunkHeader( PrimitiveReader reader ) { AiffChunkHeader chunk = new AiffChunkHeader(); chunk.Signature = reader.ReadASCIIString( 4 ); chunk.DataSize = reader.ReadInt32(); return chunk; }