在C#中的特定设备播放声音 [英] Play a sound in a specific device with C#
问题描述
我的问题是,如果我要创建3个按钮和我有3个声卡和每个按钮是与声卡(例如Button1的是声音卡1相关...),当我点击按钮1我要。听到扬声器至极的声音与声音卡1(同为按钮2和按钮3
My problem is if I want to create 3 buttons and I have 3 sound cards and each button is related to a sound card (for example button1 is related to sound card1 ...)and when I click on button1 I want to hear sound from the speaker wich is related to sound card1 (the same for button2 and button3.
我的朋友给了我两码:第一次使用n音讯它的作品,但工作我仍然在三声卡着玩的声音,我的意思是只有一个声卡工作时,我安装三块声卡,它就像PROGRAMM是百达choising从三个外部声卡默认的音频卡。
My friends gave me two codes: the first use Naudio it works but worked for I still cant play sound in the three sound cards,I mean only one sound card work when I install the three sound cards,It's like the programm is allways choising a default audio card from the three external sound cards.
第二次使用DirectX和我的作品,但我不明白,他怎么调用设备号,我的意思是在使用代码n音讯存在devicenumber = 1例如:我需要知道如何,因为我会spicifie设备为每个按钮(例如,当我点击button1的声音将在声音卡1上播放)?
The second use DirectX and it works for me but I didn't understand how he call the device number,I mean in the code which use NAudio there is "devicenumber= 1 for example",I need to know how because i'll spicifie a device for each button (for example when I click on button1 the sound will be played in sound card1)?
我要知道我们如何可以纠正两个代码之一,我怎么能在第二个代码specifie一个设备,出租车你帮我请??
I want to know how we can correct one of the two codes and how can I specifie a "Device " in the second code,cab you help me please??
这是代码窗体2(从该项目,该项目使用n音讯),你可以声明它是如何specifie设备为每个按钮,但不幸的是它会导致此问题mentionned:
This is the Code of Form2 (from the project which use NAudio) you can notices how it specifie a device for each button but unfortunately it cause the problem mentionned:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NAudio.Wave;
using NAudio.CoreAudioApi;
namespace AudioWithNAudio
{
public partial class Form2 : Form
{
string fileName = null;
WaveOut wave = null;
private NAudio.Wave.WaveFileReader waveReader = null;
private NAudio.Wave.DirectSoundOut output = null;
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
hideButtons();
fileName = ("alarm.wav");
detectDevices();
}
public void hideButtons()
{
bttnAudioDevice1.Visible = false;
bttnAudioDevice2.Visible = false;
bttnAudioDevice3.Visible = false;
bttnAudioDevice4.Visible = false;
bttnAudioDevice5.Visible = false;
}
public void detectDevices()
{
int waveOutDevices = WaveOut.DeviceCount;
switch (waveOutDevices)
{
case 1:
bttnAudioDevice1.Visible = true;
break;
case 2:
bttnAudioDevice2.Visible = true;
bttnAudioDevice1.Visible = true;
break;
case 3:
bttnAudioDevice2.Visible = true;
bttnAudioDevice1.Visible = true;
bttnAudioDevice3.Visible = true;
break;
case 4:
bttnAudioDevice2.Visible = true;
bttnAudioDevice1.Visible = true;
bttnAudioDevice3.Visible = true;
bttnAudioDevice4.Visible = true;
break;
case 5:
bttnAudioDevice2.Visible = true;
bttnAudioDevice1.Visible = true;
bttnAudioDevice3.Visible = true;
bttnAudioDevice4.Visible = true;
bttnAudioDevice5.Visible = true;
break;
}
}
private void bttnAudioDevice1_Click(object sender, EventArgs e)
{
wave = new WaveOut();
wave.DeviceNumber = 0;
playSound();
}
private void bttnAudioDevice2_Click(object sender, EventArgs e)
{
wave = new WaveOut();
wave.DeviceNumber = 1;
playSound();
}
private void bttnAudioDevice3_Click(object sender, EventArgs e)
{
wave.DeviceNumber = 2;
playSound();
}
private void bttnAudioDevice4_Click(object sender, EventArgs e)
{
wave.DeviceNumber = 3;
playSound();
}
private void bttnAudioDevice5_Click(object sender, EventArgs e)
{
wave.DeviceNumber = 4;
playSound();
}
public void playSound()
{
disposeWave();// stop previous sounds before starting
waveReader = new NAudio.Wave.WaveFileReader(fileName);
output = new NAudio.Wave.DirectSoundOut();
output.Init(new NAudio.Wave.WaveChannel32(waveReader));
output.Play();
}
public void disposeWave()
{
if (output != null)
{
if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing)
{
output.Stop();
output.Dispose();
output = null;
}
}
if (wave != null)
{
wave.Dispose();
wave = null;
}
}
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
disposeWave();
}
private void bttnStop_Click(object sender, EventArgs e)
{
if (output != null)
{
if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing)
{
output.Stop();
}
}
}
}
}
这是Form1的代码(使用DirectX的项目):
And this is the code of Form1 (from the project using DirectX):
using System;
using System.Windows.Forms;
using Microsoft.DirectX.DirectSound;
using DirectSound = Microsoft.DirectX.DirectSound;
namespace DirectSoundPlay
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ReSizeControls();
}
private void playToolStripMenuItem_Click(object sender, EventArgs e)
{
if (listBox2.SelectedItems.Count == 0)
return;
if (listBox2.SelectedItems.Count > 1)
{
MessageBox.Show("Too many SelectedItems");
return;
}
ClassAudioDevice ad = listBox2.SelectedItem as ClassAudioDevice;
if (ad == null)
{
MessageBox.Show("SelectedItem is not a ClassAudioDevice");
return;
}
DirectSound.Device Device = new DirectSound.Device(ad.DriverGuid);
Device.SetCooperativeLevel(this.Handle, DirectSound.CooperativeLevel.Priority);
DirectSound.Buffer AudioBuffer = new DirectSound.Buffer("C:\\Windows\\Media\\notify.wav", Device);
AudioBuffer.Play(0, BufferPlayFlags.Default);
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
private void Form1_SizeChanged(object sender, EventArgs e)
{
ReSizeControls();
}
private void ReSizeControls()
{
int w = ClientSize.Width >> 1;
listBox1.Width = w - 1;
listBox2.Width = w - 1;
listBox1.Height = ClientSize.Height;
listBox2.Height = ClientSize.Height;
}
private void Form1_Load(object sender, EventArgs e)
{
DirectSound.DevicesCollection DevicesList = new DirectSound.DevicesCollection();
DirectSound.CaptureDevicesCollection CaptureDevicesList = new DirectSound.CaptureDevicesCollection();
ClassAudioDevice ad;
//
foreach (DirectSound.DeviceInformation di in CaptureDevicesList)
{
ad = new ClassAudioDevice();
ad.Description = di.Description;
ad.DriverGuid = di.DriverGuid;
listBox1.Items.Add(ad);
}
foreach (DirectSound.DeviceInformation di in DevicesList)
{
ad = new ClassAudioDevice();
ad.Description = di.Description;
ad.DriverGuid = di.DriverGuid;
listBox2.Items.Add(ad);
}
}
}
}
和这是ClassAudioDevice的代码(从同一项目):
And this is the code of ClassAudioDevice (from the same project):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DirectSoundPlay
{
class ClassAudioDevice
{
public string Description = "";
public Guid DriverGuid = new Guid();
public override string ToString()
{
return Description;
}
}
}
感谢您在advance.Good一天。
Thank you in advance.Good day.
推荐答案
在您的按钮单击处理程序要创建一个waveout的设备,并设置其设备编号,然后将playSound功能播放听起来使用完全不同的IWavePlayer(DirectSoundOut的一个实例)。有几个问题,你的代码,因为它代表(特别是并发播放),但我会通过将设备号到playSound功能启动。
In your button click handlers you are creating a WaveOut device, setting its device number, and then your playSound function plays sound using a completely different IWavePlayer (an instance of DirectSoundOut). There are several problems with your code as it stands (particularly with concurrent playbacks), but I would start by passing the device number into the playSound function.
public void playSound(int deviceNumber)
{
disposeWave();// stop previous sounds before starting
waveReader = new NAudio.Wave.WaveFileReader(fileName);
var waveOut = new NAudio.Wave.WaveOut();
waveOut.DeviceNumber = deviceNumber;
output = waveOut;
output.Init(waveReader);
output.Play();
}
这篇关于在C#中的特定设备播放声音的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!