Dobbiamo costruire la classe AndroidAudioDevice.
Ci provo.
Dichiariamo intanto le due variabili, l'una che mi sembra la più importante, di tipo AudioTrack, e l'altra che è una matrice di short, il buffer.
class AndroidAudioDevice{
AudioTrack track;
short[] buffer = new short[1024];
}
Bene. E ora?Ora c'è il costruttore, in cui: si ottiene un int minSize, che dovrebbe essere la minima dimensione del buffer.
Vediamolo
class AndroidAudioDevice{
AudioTrack track;
short[] buffer = new short[1024];
int minSize=AudioTrack.getMinBufferSize(44100,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
}
Quindi si definisce track:
public AndroidAudioDevice() {
int minSize = AudioTrack.getMinBufferSize(44100,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
track = new AudioTrack(AudioManager.STREAM_MUSIC,
44100,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
minSize,
AudioTrack.MODE_STREAM);
track.play();
}
Aggiungo track.play() ed ecco tutto il costruttore.
Ora bisognerebbe creare il metodo writeSamples che ha per parametri un array di float.
Provo...
public void writeSamples(float[] samples){
fillBuffer(samples);
}
Questo passa subito al metodo privato fillBuffer (che ancora non esiste) il suo parametro array di float.Quindi scrive su track quello che legge sul buffer che è "di ritorno" da fillBuffer.
public void writeSamples(float[] samples){
fillBuffer(samples);
track.write(buffer,0,samples.length);
}
E ora resta da definire fillBuffer.
private void fillBuffer(float[] samples){
}
nel quale prima si adeguano le dimensioni del buffer all'array di samples.
private void fillBuffer(float[] samples){
if(buffer.length < samples.length){
buffer=new short[samples.length];
}
}
e quindi si prendono uno per uno tutti i float di samples e si convertono in short per trasferirli nell'array di short che è buffer.
for(int i=0;i<samples.length;i++){
buffer[i]=(short)(samples[i]*Short.MAX_VALUE);
}
Ecco.Mi riscrivo qui il codice completo:
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
class AndroidAudioDevice{
AudioTrack track;
short[] buffer = new short[1024];
public AndroidAudioDevice() {
int minSize = AudioTrack.getMinBufferSize(44100,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
track = new AudioTrack(AudioManager.STREAM_MUSIC,
44100,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
minSize,
AudioTrack.MODE_STREAM);
track.play();
}
public void writeSamples(float[] samples){
fillBuffer(samples);
track.write(buffer,0,samples.length);
}
private void fillBuffer(float[] samples){
if(buffer.length < samples.length){
buffer=new short[samples.length];
for(int i=0;i<samples.length;i++){
buffer[i]=(short)(samples[i]*Short.MAX_VALUE);
}
}
}
}
}
Nessun commento:
Posta un commento