예제 #1
0
 protected virtual void Dispose(bool disposing)
 {
     if (disposing)
     {
         _audioFile?.Dispose();
     }
 }
예제 #2
0
        protected virtual void Dispose(bool disposing)
        {
            if (!disposing)
            {
                return;
            }

            _replayGainFilterLifetime?.Dispose();
            _audioFile?.Dispose();
        }
예제 #3
0
        public void Submit(SampleCollection samples)
        {
            Contract.Ensures(_buffer != null);

            if (_buffer == null)
            {
                _buffer = new int[samples.SampleCount * samples.Channels];
            }

            if (!samples.IsLast)
            {
                var index = 0;
                for (var sample = 0; sample < samples.SampleCount; sample++)
                {
                    for (var channel = 0; channel < samples.Channels; channel++)
                    {
                        _buffer[index++] = (int)Math.Round(samples[channel][sample] * _multiplier);
                    }
                }

                GCHandle handle = GCHandle.Alloc(_buffer, GCHandleType.Pinned);

                try
                {
                    var bufferList = new AudioBufferList
                    {
                        NumberBuffers = 1,
                        Buffers       = new AudioBuffer[1]
                    };
                    bufferList.Buffers[0].NumberChannels = (uint)samples.Channels;
                    bufferList.Buffers[0].DataByteSize   = (uint)(index * Marshal.SizeOf <int>());
                    bufferList.Buffers[0].Data           = handle.AddrOfPinnedObject();

                    ExtendedAudioFileStatus status = _audioFile.Write(bufferList, (uint)samples.SampleCount);
                    if (status != ExtendedAudioFileStatus.Ok)
                    {
                        throw new IOException(string.Format(CultureInfo.CurrentCulture,
                                                            Resources.SampleEncoderWriteError, status));
                    }
                }
                finally
                {
                    handle.Free();
                }
            }
            else
            {
                _audioFile.Dispose();

                // Call an external MP4 encoder for writing iTunes-compatible atoms:
                _stream.Position = 0;

                ExportFactory <IMetadataEncoder> metadataEncoderFactory =
                    ExtensionProvider.GetFactories <IMetadataEncoder>("Extension", EncoderInfo.FileExtension)
                    .SingleOrDefault();
                if (metadataEncoderFactory == null)
                {
                    throw new ExtensionInitializationException(string.Format(CultureInfo.CurrentCulture,
                                                                             Resources.SampleEncoderMetadataEncoderError, EncoderInfo.FileExtension));
                }

                using (ExportLifetimeContext <IMetadataEncoder> metadataEncoderLifetime = metadataEncoderFactory.CreateExport())
                    metadataEncoderLifetime.Value.WriteMetadata(_stream, _metadata, _settings);
            }
        }