AVAudioPlayer spielt nur während dem Ladevorgang ab

yateha

Neues Mitglied
Thread Starter
Dabei seit
14.10.2011
Beiträge
8
Reaktionspunkte
0
Hallo,

ich habe mich inzwischen mal etwas in die App-Entwicklung für iOS eingearbeitet und finde auch, dass es Spaß macht, iOS-Apps zu entwickeln. Nur leider versuche ich inzwischen schon seit längerer Zeit, einen Fehler in meiner App zu beheben, aber ich komme einfach nicht auf die Lösung, daher möchte ich hier mal nachfragen.

Ich habe die XCode-Vorlage "Tabbed Application" verwendet und habe nun zwei "Tabs". Nun möchte ich eine mp3-Datei namens "bgmusic.MP3" im Hintergrund abspielen und nutze dazu den folgenden Code in der FirstViewController.m:

PHP:
//Musik abspielen
    NSString *path = [[NSBundle mainBundle] pathForResource:@"bgmusic" ofType:@"MP3"];
    theAudio= [[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL] autorelease];
    theAudio.delegate = self;
    theAudio.numberOfLoops = 20;
    [theAudio prepareToPlay];
    [theAudio play];

Und dies ist der entsprechende Code in der FirstViewController.h:
PHP:
@interface FirstViewController : UIViewController <AVAudioPlayerDelegate> {
    AVAudioPlayer *theAudio;
}

@property (nonatomic, retain) AVAudioPlayer *theAudio;

Und in der AppDelegate.m steht noch
PHP:
@synthesize theAudio;

Jetzt das Problem:
Wenn ich die App nun auf meinem iPod touch 4. Generation (iOS 6) starte, spielt die Musik etwa eine halbe Sekunde ab und zwar solange das "Launch Image" (also der Ladebildschirm praktisch) angezeigt wird. Sobald die App dann geladen ist, beendet die Musik plötzlich und auch ohne Ausgabe im Ausgabefenster. Die Musik spielt auch bei erneutem Anzeigen der App (d.h. Home-Button > Icon antippen) nicht mehr ab. Bei einem iPhone 4 (iOS 5) ist es dasselbe Problem.

Ich hoffe, dass mir jemand von euch helfen kann, weil ich bei dem Problem echt nicht mehr weiter weiß.

Danke schon mal und viele Grüße,
yateha
 
Hallo Yateha,

konntest du dein Problem lösen oder brauchst du noch Hilfe?


Gruß Sky.
 
Hallo CloudyOfSky,

danke für deine Antwort! Ich konnte das Problem bisher leider nicht lösen :(

Viele Grüße,
yateha
 
Hallo Yateha,

was den Code an geht, so sieht er gut. prepareToPlay kannst du an dieser Stelle weglassen, die hilft dir nur, wenn du die Datei zB bei der init Funktion lädst und dann bufferst. Dann kann die Musik direkt abgespielt werden, wenn du sie per play startest.

Und dein Problem ist der autorelease, nimm diesen bitte weg :) Und gebe das Objekt beim beenden des Views mit frei.


Schöne Grüße, Sky.
 
Zuletzt bearbeitet:
An das autorelease habe ich auch schon gedacht, aber ich wusste nicht, wie ich das richtig biegen soll^^
Wenn ich es entferne, erscheint die Fehlermeldung "Expected identifier". Mir will aber nicht einfallen, was da genau hinkommt :(

Kannst du mir da weiterhelfen?

Viele Grüße,
yateha
 
Hallo Yateha,

bei mir kommt keine Fehlermeldung, deshalb kann ich es gerade nicht nachvollziehen. Sonst pack dein Projekt und stell es mir zur Verfügung, dann schaue ich es mir mal an.

Code:
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Cambodia" ofType:@"MP3"];
    AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:nil];
    [newPlayer setDelegate:self];
    [newPlayer play];


Schöne Grüße, Sky.
 
Hallo Yateha,

bei mir kommt keine Fehlermeldung, deshalb kann ich es gerade nicht nachvollziehen. Sonst pack dein Projekt und stell es mir zur Verfügung, dann schaue ich es mir mal an.
Ja, das wäre gut.

Aber 1: "AVAudioPlayer spielt nur während des Ladevorgangs ab". SCNR

2: Was meinst Du mit "Im Hintergrund"? Der Sound ist hier an den FirstViewController gekoppelt. Falls dieser gelöscht wird, ist der Sound weg. Vielleicht legst Du den zwei mal an?

Alex
 
Hallo Yateha,

in Anmerkung zu Below's Beitrag:

Ich denke mal mit Ladevorgang ist das laden des Views gedacht, dabei wird das Musikstück geladen. Wenn der Autorelease drin ist, kann man für 1-2 Sekunden etwas hören - frag nicht warum. Und dann wird der Player auch schon freigegeben. Und das Musikstück läuft ja im Hintergrund ;-) Wäre es anders, könntest du nicht viel machen in der Zeit wo das Musikstück läuft. Das heißt du kannst ganz normal weiter arbeiten mit deinem App (so lange du es nicht beendest, dann ist auch die Musik weg).


Schöne Grüße, Sky.
 
Ah, ja klar. Mit dem Autorelease ist der Player im nächsten Run Loop weg. Da hört man dann nix mehr :p

Alex
 
Ja, es hat funktioniert :) Hat also tatsächlich an dem autorelease gelegen. Ich dachte eigentlich immer, dass autorelease das Objekt erst frei gibt, wenn keine Referenzen mehr darauf existieren. Und ich habe angenommen, dass das Abspielen der Musik eine Referenz ist...ist das nicht so?

Auf jeden Fall vielen Dank für eure Hilfe!

Viele Grüße,
yateha
 
ich dachte eigentlich immer, dass autorelease das Objekt erst frei gibt, wenn keine Referenzen mehr darauf existieren.
Nein. Also Jein. Um genau zu sein:

1. Das Objekt wird gelöscht, wenn keine Referenzen mehr darauf existieren. (lies: Punkt)

2. "Autorelease" entfernt eine Referenz, allerdings nicht sofort (wie release), sondern erst, wenn das Programm das nächste mal in den Runloop kommt.

Und ich habe angenommen, dass das Abspielen der Musik eine Referenz ist...ist das nicht so?
Eine nicht vollkommen unsinnige Annahme, aber nein, das ist nicht so.

Noch Fragen?

Gruss

Alex
 
Okay, danke für die Erklärungen! :)

Viele Grüße,
yateha
 
Hallo Yateha,

gerne doch und zu deiner Frage, da empfehle ich dir das Kapitel über die Speicherverwaltung zu lesen, weil das brauchst du auf jeden Fall, das kommt in jedem App vor. Da steht auch wann und wie du den Autorelease einsetzt.


Schöne Grüße, Sky.
 
gerne doch und zu deiner Frage, da empfehle ich dir das Kapitel über die Speicherverwaltung zu lesen, weil das brauchst du auf jeden Fall, das kommt in jedem App vor. Da steht auch wann und wie du den Autorelease einsetzt.

Das kann man immer noch mal lesen, aber ich finde, Yateha hat schon ein besseres Verständnis von Memory Management als 30% der Leute, die sich hier als "Senior iOS Developer" vorstellen :faint:

Alex
 
Zurück
Oben Unten