上記リンクを参照し、コンボボックスにマイクの名称を
表示するところまでは進めることが出来ました。
このコードがありませんが、どうやったのでしょう?
NAudio - C# Show Device master peak in realtime - YouTube
この動画はWindows Formsで作っているので、そのままでは使えません(NAudioについては参考になります)
上記のようなコードを書いていました。
かっこの対応がずれてますしタイプミスもあり、本当に試したのかと不安になります。
どこまでできていて、何に詰まっているかをはっきりさせてください。
動画の内容をWPFで書くとこんな感じでしょうか。
xml
1 < Window
2 x: Class = " Questions291997.MainWindow "
3 xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
4 xmlns: x = " http://schemas.microsoft.com/winfx/2006/xaml "
5 Width = " 800 "
6 Height = " 450 " >
7 < StackPanel >
8 < ComboBox x: Name = " comboBox " DisplayMemberPath = " FriendlyName " />
9 < TextBlock x: Name = " textBlock " />
10 < ProgressBar x: Name = " progressBar " Height = " 30 " />
11 </ StackPanel >
12 </ Window >
cs
1 using System ;
2 using System . Windows ;
3 using System . Windows . Threading ;
4 using NAudio . CoreAudioApi ;
5
6 namespace Questions291997
7 {
8 public partial class MainWindow : Window
9 {
10 private DispatcherTimer timer ;
11
12 public MainWindow ( )
13 {
14 InitializeComponent ( ) ;
15
16 var enumerator = new MMDeviceEnumerator ( ) ;
17 var devices = enumerator . EnumerateAudioEndPoints ( DataFlow . All , DeviceState . Active ) ;
18 foreach ( var device in devices )
19 {
20 comboBox . Items . Add ( device ) ;
21 }
22
23 timer = new DispatcherTimer { Interval = TimeSpan . FromMilliseconds ( 10 ) , } ;
24 timer . Tick += Timer_Tick ;
25 timer . Start ( ) ;
26 }
27
28 private void Timer_Tick ( object sender , EventArgs e )
29 {
30 if ( comboBox . SelectedItem is MMDevice device )
31 {
32 var v = ( int ) Math . Round ( device . AudioMeterInformation . MasterPeakValue * 100 ) ;
33 progressBar . Value = v ;
34 textBlock . Text = v . ToString ( ) ;
35 }
36 }
37 }
38 }
しかしこれってピーク音量ですよね?ちょっとホールド時間が長くてカクカク?する感じで、リアルタイム値とはいえないですよね。
Unityで既定以外の録音デバイスを使う(口パク) - Qiita
NAudio/RecordingLevelMeter.md at master · naudio/NAudio
こちらもピークをとってるのは同じですが、ホールドが短くちょうどいい感じがしました(バッファサイズによるのでしょうが)
xml
1 < Window
2 x: Class = " Questions291997.MainWindow "
3 xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
4 xmlns: x = " http://schemas.microsoft.com/winfx/2006/xaml "
5 Width = " 800 "
6 Height = " 450 " >
7 < StackPanel >
8 < ComboBox x: Name = " comboBox " SelectionChanged = " ComboBox_SelectionChanged " />
9 < TextBlock x: Name = " textBlock " />
10 < ProgressBar x: Name = " progressBar " Height = " 30 " />
11 </ StackPanel >
12 </ Window >
cs
1 using System . Windows ;
2 using System . Windows . Controls ;
3 using System . Windows . Threading ;
4 using NAudio . Wave ;
5
6 namespace Questions291997
7 {
8 public partial class MainWindow : Window
9 {
10 private WaveInEvent waveIn ;
11
12 public MainWindow ( )
13 {
14 InitializeComponent ( ) ;
15
16 for ( var i = 0 ; i < WaveIn . DeviceCount ; i ++ )
17 {
18 comboBox . Items . Add ( WaveIn . GetCapabilities ( i ) . ProductName ) ;
19 }
20 }
21
22 private void ComboBox_SelectionChanged ( object sender , SelectionChangedEventArgs e )
23 {
24 if ( waveIn != null )
25 {
26 waveIn . StopRecording ( ) ;
27 waveIn . DataAvailable -= OnDataAvailable ;
28 waveIn . Dispose ( ) ;
29 }
30
31 waveIn = new WaveInEvent { DeviceNumber = comboBox . SelectedIndex } ;
32 waveIn . DataAvailable += OnDataAvailable ;
33 waveIn . StartRecording ( ) ;
34 }
35
36 private void OnDataAvailable ( object sender , WaveInEventArgs e )
37 {
38 var max = 0f ;
39 for ( var i = 0 ; i < e . BytesRecorded ; i += 2 )
40 {
41 var sample = ( short ) ( ( e . Buffer [ i + 1 ] << 8 ) | e . Buffer [ i + 0 ] ) ;
42 var sample32 = sample / 32768f ;
43 if ( sample32 < 0 ) sample32 = - sample32 ;
44 if ( sample32 > max ) max = sample32 ;
45 }
46
47 Dispatcher . Invoke ( ( ) =>
48 {
49 textBlock . Text = ( 100 * max ) . ToString ( "0" ) ;
50 progressBar . Value = 100 * max ;
51 } ) ;
52 }
53 }
54 }
計算?のところは公式のコードをそのままですが、おそらく入力のフォーマットによって変更する必要があると思います(よくわかりません^^;
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/16 00:02