Метод Android.Media.AudioTrack.GetMinBufferSize - как использовать его синтаксис в Xamarin.Android (C#)?
В настоящее время я делаю музыкальное приложение для Android в студии Xamarin, используя csharp. Я делаю простое приложение для синтезатора, и на данный момент я застрял в методе GetMinBufferSize с csharp.
Документация Xamarin.Android предоставляет следующий синтаксис для метода GetMinBufferSize (вот ссылка: документация по аудиотреку API xamarin:
[Android.Runtime.Register("getMinBufferSize", "(III)I", "")]
public static int GetMinBufferSize (int sampleRateInHz,
[Android.Runtime.GeneratedEnum] ChannelOut channelConfig,
[Android.Runtime.GeneratedEnum] Encoding audioFormat)
- что соответствует следующему в Java (ссылка: ссылка на Android):
public static int getMinBufferSize (int sampleRateInHz, int channelConfig, int audioFormat)
Я не понимаю, что это за вещи и как я должен их использовать: [Android.Runtime.Register("getMinBufferSize", "(III)I", "")] [Android.Runtime.GeneratedEnum] [Android.Runtime.GeneratedEnum]
Код на Java был проще:
int buffsize = AudioTrack.getMinBufferSize(_sampleRate,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
где _sampleRate: int _sampleRate = 44100; и представляет частоту.
Итак, если бы вы хотя бы сказали мне, что это за три строки в скобках из документации по xamarin, я был бы очень благодарен.
Заранее спасибо и хорошего дня.
Мой код до сих пор:
namespace simple_synth
{
[Activity (Label = "_secondAct")] //activity that opens the second screen
public class _secondAct : Activity
{
Thread _thread; //audio processing thread
int _sRate = 44100; //sampling rate
bool isRunning = true; //switch on/off
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView (Resource.Layout._secondLay);
Button btn2 = FindViewById<Button> (Resource.Id.myButton_synth);
_audio _audioSound = new _audio ();
btn2.Click += (sender, e) => {
btn2.Text = "GOOD";
Thread _audioThread = new Thread(_audioSound._makeSound);
_audioThread.Start();
Console.WriteLine("audio thread: started");
while (!_audioThread.IsAlive);
Thread.Sleep(1000);
_audioSound._stopRequest();
_audioThread.Join();
Console.WriteLine("audio thread: terminated now!");
_audioSound._startRequest();
};
}
}//_secondAct
public class _audio{
private volatile bool _stopItNow;
public void _makeSound(){ // This method will be called when the thread is started.
while (!_stopItNow) {
Console.WriteLine ("audio thread: is playing the sound...");
AudioTrack _audioTrack = new AudioTrack (Stream.Music, 22050,
ChannelConfiguration.Mono,
Android.Media.Encoding.Pcm16bit,
_audBuffer.Length, AudioTrackMode.Stream);
_audioTrack.Play ();
_audioTrack.Write (_audBuffer, 0, _audBuffer.Length);
}
Console.WriteLine ("audio thread: terminated.");
} //doWork
public void _stopRequest()
{
_stopItNow = true;
}
public void _startRequest()
{
_stopItNow = false;
}
}
}
1 ответ
Очень просто в C#:
var minBufSize = AudioTrack.GetMinBufferSize (
44100,
ChannelOut.Mono,
Encoding.Pcm16bit);