Canon DSLR – daljinski (Android) okidač – Aplikacija

Kao što objasnih u ovom blogu, na izlaz stereo priključka je potrebno emitovati ton, a to će, ukoliko je fotoaparat povezan na telefon preko interfejsa, uzrokovati fokusiranje odnosno okidanje, u zavisnosti na koji kanal smo emitovali ton. Za generisanje tona, modifikovao sam i koristio klasu sa ove stranice: stackoverflow.com/ques…bud-left-or-right. Pomoću nje se može lako generisati pravougaoni signal određene frekvencije i dužine trajanja. Modifikovana verzija klase je ispod.
<.blockquote>

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;

public class ToneGen {

    AudioTrack aTrack;
    byte[] buffer;
    int fps = 16000;
    int samplesPerFrame = 4;

    /**
    *@param frequency The frequency of the tone
    */    
    public ToneGen(int frequency)  {
        buffer = new byte[fps];
        int T = (int) fps / frequency ;
        int To2 = (int) T / 2;
        for ( int i=0; i<buffer.length; i+=T ) {
            for (int j = 0; j < To2; j++)
            {
                buffer[i+j] = (byte) 127;
                buffer[i+j+To2] = (byte) -127;
            }
        }
    }

    /*
    * @param duration Duration of sound in seconds
    * @param leftVolume Left volume 0.0f - silent, 1.0f full volume
    * @param rightVolume Right volume 0.0f - silent, 1.0f full volume
    */
    public void Play(float duration, float leftVolume, float rightVolume) throws Exception {
        int u = 1;
        if (duration < 1) {
            u = Math.round(1 / duration);
            if (u != 2 && u != 4 && u != 8 && u != 16 && u != 32 && u != 64 && u != 128) throw new Exception("Invalid exposure");
        }
        aTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
             fps/samplesPerFrame, AudioFormat.CHANNEL_OUT_STEREO,
             AudioFormat.ENCODING_PCM_16BIT,
             buffer.length/u, AudioTrack.MODE_STATIC);
        if (duration > 1) 
            aTrack.setLoopPoints(0, fps/samplesPerFrame, Math.round(duration)-1);

            aTrack.write(buffer, 0, buffer.length);
            aTrack.setStereoVolume(leftVolume, rightVolume);
            aTrack.play();                
    }

    public void Stop(){
        aTrack.stop();
    }

}

.
Klasu koristite tako što konstruktoru prosledite željen frekvenciju tona koji želite da generišete. Ja sam koristio frekvenciju od 500Hz i sa tim parametrima je interfejs opisan u prethodnom blogu radio kako treba. Kada želite da emitujete ton, potrebno je da pozovete metodu Play(). Njoj prosleđujete dužinu trajanja tona u sekundama i jačinu zvuka za levi odnosno desni kanal. Primer:
.

ToneGen tg = new ToneGen(500);
try { tg.Play(5.0f, 0.0f, 1.0f); } catch (Exception e) {}

.
Ovako pzvana metoda Play() će emitovati zvuk od 500Hz, trajanja pet sekundi, samo na desni kanal stereo priključka. To će prouzrokovati da, kada je aparat preko interfejsa povezan na telefon, aparat fokusira 🙂

Ukoliko želite da ekspozicija traje manje od jedne sekunde, potrebno je da emitujete ton kraći od jedne sekunde. Takav ton možete da generišete na sledeći način:

.

ToneGen tg = new ToneGen(500);
try { tg.Play(0.125f, 0.0f, 1.0f); } catch (Exception e) {}

.

Važno je da dužina trajanja tona koji želite da emitujete (dužina ekspozicije) bude jedna od sledećih vrednosti: 1/2, 1/4, 1/8, 1/16, 1/32, 1/64 ili 1/128 u decimalnom zapisu.

NAPOMENA: Canon fotoaparati, kada se fotografiše u BULB modu, u EXIF podacima dužine ekspozicije koje su manje od jedne sekunde zaokružuju na jednu sekundu!

Navigacija: Ideja Planiranje / Interfejs / [ Aplikacija ] / Praksa

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.