- Forum-Beiträge: 20
07.11.2015, 12:19:47 via Website
07.11.2015 12:19:47 via Website
Will man ein Handy als Infrarot-Fernbedienung benutzen, kann man mit einem geeigneten Programm 19-kHz-"Morsesignale" erzeugen und an den Kopfhörer-Anschluss einen Infrarot-Adapter (mit Frequenzverdopplung) anschließen. Das ist inzwischen "Stand der Technik" (Beispiel: Irdroid). Mein Nexus 5 mit Android 6.0 verbeult diese Morsesignale aber so, dass sie unbrauchbar sind, wie das Bild zeigt:
In der oberen Hälfte des Bildes sind solche vom Oszillographen abfotografierten 19-kHz-"Morsesignale" zu sehen, die so sind wie wie sie sein müssen. Sie sind von einem Medion Lifetab P9516 mit Android 4.0.3 erzeugt worden. In der unteren Hälfte sind die mit dem selben Programm (s.u.) erzeugten Signale meines Nexus 5 zu sehen (gleicher Oszillograph, gleicher Maßstab) und sind unbrauchbar. Es sieht so aus, als ob das Nexus 5 die vom Programm erzeugten 19-kHz-Signale noch mal intern mit einer zu niedrigen Frequenz abtastet, bevor es sie auf den Kopfhöreranschluss jagt, und dann schlägt das "Abtasttheorem" zu. Oder als ob es die Signale erst betragsmäßig mittelt und dann differenziert und erst dann rausjagt. Weiß jemand was genaueres darüber, wie das Nexus 5 das intern macht und ob/wie man das beeinflussen kann? Oder findet jemand einen Fehler in dem Testprogramm (auf dem Medion P9516 funktioniert es ja richtig)? Hier das Testprogramm:
package com.example.hfmarkspace;
import android.support.v7.app.ActionBarActivity;
import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
public class MarkSpaceMainActivity extends ActionBarActivity {
byte generatedSnd[]; // byte array for audio track
Handler mHandler = new Handler(); // for repeated play of audioTrack
AudioTrack audioTrack;
AudioManager audio;
int streamMaxVolume;
int delay = 100;
int scanRate = 38000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mark_space_main);
audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
streamMaxVolume = audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
audio.setStreamVolume(AudioManager.STREAM_MUSIC, streamMaxVolume, 0);
// calc. & fill audio buffer
int buffSize = AudioTrack.getMinBufferSize(
scanRate, AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_8BIT);
generatedSnd = new byte[buffSize];
int i = 0;
for (int k=0; k<8; ++k) { // 8 mark-spaces
for (int j=0; j<5; ++j) { // 5 mark wavelets
generatedSnd[i++] = 0;
generatedSnd[i++] = -1; // = 255
generatedSnd[i++] = -1; // = 255
generatedSnd[i++] = 0;
}
for (int j=0; j<24; ++j) { // 6 space wavelets
generatedSnd[i++] = 127;
}
}
for (int k=i; k<buffSize; ++k) { // trailer spaces
generatedSnd[k] = 127;
}
// play audio buffer in endless loop
mHandler.post(rept);
}
private Runnable rept = new Runnable() {public void run() {
mHandler.removeCallbacks(this);
if (audioTrack!=null) {
audioTrack.flush();
audioTrack.release();
}
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
scanRate, AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_8BIT, generatedSnd.length,
AudioTrack.MODE_STATIC);
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
mHandler.postDelayed(this, delay);
}};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.mark_space_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.