static unsafe SoftwareBitmap ColorizeMelspectrogram(SoftwareBitmap bwSpectrogram) { using (BitmapBuffer buffer = bwSpectrogram.LockBuffer(BitmapBufferAccessMode.Write)) { using var reference = buffer.CreateReference(); IMemoryBufferByteAccess memoryBuffer = reference.As <IMemoryBufferByteAccess>(); memoryBuffer.GetBuffer(out byte *dataInBytes, out uint capacity); // Edit the BGRA Plane BitmapPlaneDescription bufferLayout = buffer.GetPlaneDescription(0); for (int i = 0; i < bufferLayout.Height; i++) { for (int j = 0; j < bufferLayout.Width; j++) { int pixel = bufferLayout.StartIndex + bufferLayout.Stride * i + 4 * j; //Lines below can be tweaked for different custom color filters //Blue dataInBytes[pixel + 0] = (byte)((255 - dataInBytes[pixel + 0]) / 2); //Green dataInBytes[pixel + 1] = (byte)(dataInBytes[pixel + 1] / 2); //Red //dataInBytes[pixel + 2] = (byte)(dataInBytes[pixel + 2]); //Alpha - must leave each pixel at max dataInBytes[bufferLayout.StartIndex + bufferLayout.Stride * i + 4 * j + 3] = (byte)255; } } } return(bwSpectrogram); }
//unsafe private void M_AudioGraph_QuantumProcessed(AudioGraph sender, object args) //{ //} unsafe private void M_AudioGraph_QuantumStarted(AudioGraph sender, object args) { // draw every n frames //if (fctr++ % 5 == 0) //{ using (AudioFrame audioFrame = this.m_AudioFrameOutputNode.GetFrame()) using (AudioBuffer audioBuffer = audioFrame.LockBuffer(AudioBufferAccessMode.Read)) using (IMemoryBufferReference memBufferRef = audioBuffer.CreateReference()) { IMemoryBufferByteAccess byteAccess = memBufferRef as IMemoryBufferByteAccess; byte *byteBuffer; uint capacity; byteAccess.GetBuffer(out byteBuffer, out capacity); float *floatBuffer = (float *)byteBuffer; for (int i = 0; i < this.m_AudioGraph.SamplesPerQuantum * this.m_AudioGraph.EncodingProperties.ChannelCount; i++) { this.m_QuantumSamples[i] = floatBuffer[i]; } this.m_Capacity = capacity; this.m_abCap = audioBuffer.Capacity; this.m_abLen = audioBuffer.Length; } AudioCanvas.Invalidate(); //} }
public BufferMemoryManager(IMemoryBuffer buffer) { reference = buffer?.CreateReference() ?? throw new ArgumentNullException(nameof(buffer)); if (reference is IMemoryBufferByteAccess) { byteAccess = (IMemoryBufferByteAccess)reference; } else { reference.Dispose(); throw new ArgumentException("buffer does not implment IMemoryBufferByteAccess"); } }