1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

Audioprogrammierung mit Objective-C

Dieses Thema im Forum "OS X-Developer" wurde erstellt von snoopysalive, 10.04.08.

  1. snoopysalive

    snoopysalive Allington Pepping

    Dabei seit:
    19.08.05
    Beiträge:
    195
    Hallo!

    Ich habe mir vor Kurzem unter Java einen kleinen Synthesizer gebastelt, der mir einfach nur Sinus-, Dreieck-, Sägezahn- und Pulswellen und Rauschen erzeugt. Das ging mit Java recht einfach, auch wenn ich ein wenig googlen musste, bis ich ein Code-Fragment fand, das ich auch kapierte.

    Dieser Erfolg ist mir unter Objective-C allerdings noch verwehrt geblieben und deshalb wende ich mich nun an euch Objective-C-Gurus. Was genau will ich also?

    Nun, ich möchte so auf die Soundkarte zugreifen können, dass ich in Echtzeit einen Audiostream an die Soundkarte übergeben kann, welcher dann natürlich auch ausgegeben wird. Unter Java sieht das in etwa so aus, wobei ich auf Fehlerbehandlung verzichte und stellenweise eher pseudocodeartig artikuliere:

    Code:
    import java.sound.sampled.*;
    class SoundTest {
        public void synthesizer() {
            /* Audioausgabeeigenschaften konfigurieren */
            float sampleRate = 44100f;
            int bits = 16;
            int channels = 2;
            /* Entsprechendes AudioFormat erzeugen und Live-Synthese starten */
            AudioFormat af = new AudioFormat(sampleRate, bits, channels, true, false);
            SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
            sdl.open();
            sdl.start();
            /* Nun Wellenformen erzeugen und an die Soundkarte übergeben */
            for (irgend; welche; bedinungen) {
                byte[] buffer = new byte[8];
                byte sample = /* Über irgendeinen Algorithmus irgendeine Wellenform berechnen */;
                /* Jedes buffer-Element mit sample befüllen */
                sdl.write(buffer, 0, 8);
            }
            /* Soundkartenzugriff wieder beenden */
            sdl.stop();
            sdl.drain();
            sdl.close();
        }
    }
    
    Ich hoffe, der Code zeigt euch, auf was ich hinaus will.

    Wie dem auch sei, ich habe jedenfalls noch kein passendes Tutorial im Netz gefunden bzw. das CoreAudio-Tutorial von Apple einfach noch nicht kapiert. Es wäre daher echt super, wenn jemand von euch die Knoten in meinem Hirn entwirren könnte, indem er mir erklärt, wie ich den oben beschriebenen Java-Code nach Objective-C portieren könnte. Sobald der Soundkartenzugriff geklärt ist, sollte ich wieder allein zurecht kommen können.

    Ich danke für jeden konstruktiven Beitrag.

    Gruß,
    Matthias
     
  2. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    In Objective-C/Cocoa: Gar nicht. Cocoa hat ausser NSSound und NSBeep nichts in der Richtung zu bieten

    Die Schlagworte hier sind CoreAudio oder OpenAL

    EDIT: Du kannst natürlich NSSound mit WAV Daten oder so füllen, das ist ja ziemlich leicht.

    Alex
     
  3. snoopysalive

    snoopysalive Allington Pepping

    Dabei seit:
    19.08.05
    Beiträge:
    195
    Die NSSound-Methode kenne ich schon, aber damit kann man eben nur Audio-Dateien abspielen, wie du ja schon gesagt hast. Ich möchte aber keine Audio-Datei erzeugen und dann abspielen, sondern Samples direkt an die Soundkarte schicken, wie im Java-Beispiel beschrieben. Wenn das nur mit CoreAudio resp. OpenAL funktioniert, wäre ich froh über Instruktionen, denn ich bin aus dem Tutorial von der Developer Connection noch nicht schlau geworden.

    Danke,
    Matthias
     
  4. snoopysalive

    snoopysalive Allington Pepping

    Dabei seit:
    19.08.05
    Beiträge:
    195
    Ja, anhand dieser beiden Beispielapplikationen sollte ich eigentlich herausfinden können, wie es funktioniert. Danke!
     

Diese Seite empfehlen