Laden...

Live Sound über Mikrophone auf Lautsprecher

Letzter Beitrag vor 16 Jahren 9 Posts 2.978 Views
Live Sound über Mikrophone auf Lautsprecher

hi,
ich möchte gerne mal zum test den live sound den ich übers mikrophone rein bekomme auf den lausprecher ausgeben...aber in echtzeit!! geht das?
dann will ich halt den sound über udp zu einem anderen pc schicken also live streaming...

irgendwas klappt hier nicht bei (byte[])applicationBuffer.Read ... bekomm ne exception!?

cu


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectSound;

namespace Sound_Streaming
{
    public partial class Form1 : Form
    {
        private Thread CaptureSoundThread = null;
        public CaptureBuffer applicationBuffer = null;
        private SecondaryBuffer soundBuffer = null;
        private Device soundDevice = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CaptureSoundThread = new Thread(new ThreadStart(WaitThread));
            CaptureSoundThread.Start();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            soundDevice = new Device();
            soundDevice.SetCooperativeLevel(this, CooperativeLevel.Normal);
          
            // Set up our wave format to 44,100Hz, with 16 bit resolution
            WaveFormat wf = new WaveFormat();
            wf.FormatTag = WaveFormatTag.Pcm;
            wf.SamplesPerSecond = 44100;
            wf.BitsPerSample = 16;
            wf.Channels = 1;
            wf.BlockAlign = (short)(wf.Channels * wf.BitsPerSample / 8);
            wf.AverageBytesPerSecond = wf.SamplesPerSecond * wf.BlockAlign;

            int samplesPerUpdate = 512;

            // Create a buffer with 2 seconds of sample data
            BufferDescription bufferDesc = new BufferDescription(wf);
            bufferDesc.BufferBytes = samplesPerUpdate * wf.BlockAlign * 2;
            bufferDesc.ControlPositionNotify = true;
            bufferDesc.GlobalFocus = true;

            soundBuffer = new SecondaryBuffer(bufferDesc, soundDevice);
        }

        private void WaitThread()
        {
            while (true)
            {
                byte[] CaptureData = null;
                CaptureData = (byte[])applicationBuffer.Read(0, typeof(byte), LockFlag.None);
                soundBuffer.Write(0, CaptureData, LockFlag.None);
                // Start it playing
                soundBuffer.Play(0, BufferPlayFlags.Looping);
            }
        }
    }
}

Hallo c++coder,

bekomm ne exception!

Grundregel: Immer die genaue Exception angeben.

herbivore

ja sry,
NullReferenceException was unhandled
Object reference not set to an instance of an object.

kann man den applicationBuffer so verwenden wie ich es mache?

cu

Hallo c++coder,

Grundregel: Erst in die FAQ gucken: NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

herbivore

hi,
ja hab ich glatt vergessen eine instanz zu machen...

nur welche 2 param übergebe ich hier?


applicationBuffer = new CaptureBuffer(... , ...);

cu

hi c++coder,

hast du rausbekommen welche parameter man angeben muss?

Gruß Floyd

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net

Der Thread ist zwar schon etwas älter, aber ich würd mal gern wissen, welche Parameter hier Sinnvollerweise übergeben werden sollen

applicationBuffer = new CaptureBuffer(... , ...); 

Visit my Blog: http://michael.barz.de

Hat jemand gerausgefunden welche Parameter übergeben werden müssen bzw. hat einer dieses Programm zum laufen bekommen ?


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectSound;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Thread CaptureSoundThread = null;
        public CaptureBuffer applicationBuffer = null;
        private SecondaryBuffer soundBuffer = null;
        private Device soundDevice = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Loading();
            CaptureSoundThread = new Thread(new ThreadStart(WaitThread));
            CaptureSoundThread.Start();
        }

        private void Loading()
        {
            soundDevice = new Device();
            soundDevice.SetCooperativeLevel(this.Handle, CooperativeLevel.Normal);
            
            Capture Mic = new Capture();
            
            WaveFormat wf = new WaveFormat();
            wf.FormatTag = WaveFormatTag.Pcm;
            wf.SamplesPerSecond = 44100;
            wf.BitsPerSample = 16;
            wf.Channels = 1;
            wf.BlockAlign = (short)(wf.Channels * wf.BitsPerSample / 8);
            wf.AverageBytesPerSecond = wf.SamplesPerSecond * wf.BlockAlign;

            int samplesPerUpdate = 512;

            BufferDescription bufferDesc = new BufferDescription(wf);
            bufferDesc.BufferBytes = samplesPerUpdate * wf.BlockAlign * 2;
            bufferDesc.ControlPositionNotify = true;
            bufferDesc.GlobalFocus = true;

            soundBuffer = new SecondaryBuffer(bufferDesc, soundDevice);
            applicationBuffer = new CaptureBuffer(this.Handle, Mic);
        }

        private void WaitThread()
        {
            while (true)
            {
                byte[] CaptureData = null;
                CaptureData = (byte[])applicationBuffer.Read(0, typeof(byte), LockFlag.None, new Int32[] { 0, 10, 100 });
                soundBuffer.Write(0, CaptureData, LockFlag.None);
                soundBuffer.Play(0, BufferPlayFlags.Looping);
            }
        }
    }
}

ich denk mal das ist nahe der lösung bloß ^^ eine AccessViolation besteht immernoch ^^

CaptureData = (byte[])applicationBuffer.Read(0, typeof(byte), LockFlag.None, new Int32[] { 0, 10, 100 });

Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.