static OggPacket GetCommentPacket(MetadataDictionary metadata) { Contract.Requires(metadata != null); var comment = new VorbisComment(); try { SafeNativeMethods.VorbisCommentInitialize(out comment); foreach (var item in new MetadataToVorbisCommentAdapter(metadata)) { // The key and value need to be marshaled as null-terminated UTF-8 strings: var keyBytes = new byte[Encoding.UTF8.GetByteCount(item.Key) + 1]; Encoding.UTF8.GetBytes(item.Key, 0, item.Key.Length, keyBytes, 0); var valueBytes = new byte[Encoding.UTF8.GetByteCount(item.Value) + 1]; Encoding.UTF8.GetBytes(item.Value, 0, item.Value.Length, valueBytes, 0); SafeNativeMethods.VorbisCommentAddTag(ref comment, keyBytes, valueBytes); } OggPacket result; if (SafeNativeMethods.VorbisCommentHeaderOut(ref comment, out result) != 0) { throw new IOException(Resources.MetadataEncoderHeaderOutError); } return(result); } finally { SafeNativeMethods.VorbisCommentClear(ref comment); } }
void WriteHeader(MetadataDictionary metadata, Stream stream) { Contract.Requires(metadata != null); Contract.Requires(stream != null); Contract.Requires(stream.CanWrite); var vorbisComment = new VorbisComment(); try { SafeNativeMethods.VorbisCommentInitialize(out vorbisComment); foreach (var item in new MetadataToVorbisCommentAdapter(metadata)) { // The key and value need to be marshaled as null-terminated UTF-8 strings: var keyBytes = new byte[Encoding.UTF8.GetByteCount(item.Key) + 1]; Encoding.UTF8.GetBytes(item.Key, 0, item.Key.Length, keyBytes, 0); var valueBytes = new byte[Encoding.UTF8.GetByteCount(item.Value) + 1]; Encoding.UTF8.GetBytes(item.Value, 0, item.Value.Length, valueBytes, 0); SafeNativeMethods.VorbisCommentAddTag(ref vorbisComment, keyBytes, valueBytes); } OggPacket first; OggPacket second; OggPacket third; _encoder.HeaderOut(ref vorbisComment, out first, out second, out third); _oggStream.PacketIn(ref first); _oggStream.PacketIn(ref second); _oggStream.PacketIn(ref third); } finally { SafeNativeMethods.VorbisCommentClear(ref vorbisComment); } OggPage page; while (_oggStream.Flush(out page)) { WritePage(page, stream); } }
public AudioInfo ReadAudioInfo(Stream stream) { Contract.Ensures(Contract.Result <AudioInfo>() != null); var buffer = new byte[4096]; using (var decoder = new NativeVorbisDecoder()) { NativeOggStream oggStream = null; var vorbisComment = new VorbisComment(); try { SafeNativeMethods.VorbisCommentInitialize(out vorbisComment); using (var sync = new NativeOggSync()) { OggPage page; do { // Read from the buffer into a page: while (sync.PageOut(out page) != 1) { int bytesRead = stream.Read(buffer, 0, buffer.Length); if (bytesRead == 0) { throw new IOException(Resources.ReadError); } IntPtr nativeBuffer = sync.Buffer(bytesRead); Marshal.Copy(buffer, 0, nativeBuffer, bytesRead); sync.Wrote(bytesRead); } if (oggStream == null) { oggStream = new NativeOggStream(SafeNativeMethods.OggPageGetSerialNumber(ref page)); } oggStream.PageIn(ref page); OggPacket packet; while (oggStream.PacketOut(out packet) == 1) { decoder.HeaderIn(ref vorbisComment, ref packet); VorbisInfo info = decoder.GetInfo(); return(new AudioInfo(string.Format(CultureInfo.CurrentCulture, "{0}kbps Ogg Vorbis", info.BitrateNominal / 1000), info.Channels, 0, info.Rate, 0)); } } while (SafeNativeMethods.OggPageEndOfStream(ref page) == 0); throw new IOException(Resources.EndOfStreamError); } } finally { oggStream?.Dispose(); SafeNativeMethods.VorbisCommentClear(ref vorbisComment); } } }
public MetadataDictionary ReadMetadata(Stream stream) { Contract.Ensures(Contract.Result <MetadataDictionary>() != null); var buffer = new byte[4096]; using (var decoder = new NativeVorbisDecoder()) { NativeOggStream oggStream = null; var vorbisComment = new VorbisComment(); try { SafeNativeMethods.VorbisCommentInitialize(out vorbisComment); using (var sync = new NativeOggSync()) { OggPage page; do { // Read from the buffer into a page: while (sync.PageOut(out page) != 1) { int bytesRead = stream.Read(buffer, 0, buffer.Length); if (bytesRead == 0) { throw new IOException(Resources.ReadError); } IntPtr nativeBuffer = sync.Buffer(bytesRead); Marshal.Copy(buffer, 0, nativeBuffer, bytesRead); sync.Wrote(bytesRead); } if (oggStream == null) { oggStream = new NativeOggStream(SafeNativeMethods.OggPageGetSerialNumber(ref page)); } oggStream.PageIn(ref page); OggPacket packet; while (oggStream.PacketOut(out packet) == 1) { decoder.HeaderIn(ref vorbisComment, ref packet); if (packet.PacketNumber == 1) { return(new VorbisCommentToMetadataAdapter(vorbisComment)); } } } while (SafeNativeMethods.OggPageEndOfStream(ref page) == 0); throw new IOException(Resources.EndOfStreamError); } } finally { oggStream?.Dispose(); SafeNativeMethods.VorbisCommentClear(ref vorbisComment); } } }