Exemple #1
0
 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.");
                }
            }
        }