internal Encoder( Stream stream, int sampleRate, int channels, int totalSeconds, OpusCommentsHandle comments) { _realStream = stream; _outputStream = new MemoryStream(); _channels = channels; _totalSeconds = totalSeconds; _callbacks = InitializeCallbacks(); _handle = SafeNativeMethods.OpusEncoderCreateCallbacks( ref _callbacks, IntPtr.Zero, comments, sampleRate, channels, 0, out var error); if (error != 0) { throw new AudioEncodingException($"Opus encountered error '{error}' during initialization."); } }
internal unsafe MetadataToOpusCommentAdapter([NotNull] AudioMetadata metadata) { Handle = SafeNativeMethods.OpusEncoderCommentsCreate(); if (!string.IsNullOrEmpty(metadata.Title)) { AddTag("TITLE", metadata.Title); } if (!string.IsNullOrEmpty(metadata.Artist)) { AddTag("ARTIST", metadata.Artist); } if (!string.IsNullOrEmpty(metadata.Album)) { AddTag("ALBUM", metadata.Album); } if (!string.IsNullOrEmpty(metadata.AlbumArtist)) { AddTag("ALBUMARTIST", metadata.AlbumArtist); } if (!string.IsNullOrEmpty(metadata.Composer)) { AddTag("COMPOSER", metadata.Composer); } if (!string.IsNullOrEmpty(metadata.Genre)) { AddTag("GENRE", metadata.Genre); } if (!string.IsNullOrEmpty(metadata.Comment)) { AddTag("DESCRIPTION", metadata.Comment); } if (!string.IsNullOrEmpty(metadata.Day) && !string.IsNullOrEmpty(metadata.Month) && !string.IsNullOrEmpty(metadata.Year)) { AddTag("DATE", $"{metadata.Year}-{metadata.Month}-{metadata.Day}"); } else if (!string.IsNullOrEmpty(metadata.Year)) { AddTag("YEAR", metadata.Year); } if (!string.IsNullOrEmpty(metadata.TrackNumber)) { AddTag("TRACKNUMBER", !string.IsNullOrEmpty(metadata.TrackCount) ? $"{metadata.TrackNumber}/{metadata.TrackCount}" : metadata.TrackNumber); } if (!string.IsNullOrEmpty(metadata.TrackGain)) { AddTag("R128_TRACK_GAIN", ConvertGain(metadata.TrackGain)); } if (!string.IsNullOrEmpty(metadata.AlbumGain)) { AddTag("R128_ALBUM_GAIN", ConvertGain(metadata.AlbumGain)); } if (metadata.CoverArt == null) { return; } // Always store images in JPEG format since Vorbis is also lossy var coverArt = CoverArtFactory.ConvertToLossy(metadata.CoverArt); fixed(byte *coverArtAddress = coverArt.Data) { var error = SafeNativeMethods.OpusEncoderCommentsAddPictureFromMemory( Handle, coverArtAddress, new IntPtr(coverArt.Data.Length), -1, IntPtr.Zero); if (error != 0) { throw new AudioEncodingException($"Opus encountered error {error} writing the cover art."); } } }