0

こちらの手順に従ってローカル オーディオ ファイルをシリアル化しようとしましたが、パケットを AudioQueBuffer に直接供給する代わりに、 GKSessionを使用して bluetooth/wifi 経由で送信したいと思います。EXC_BAD_ACCESS エラーが発生します。

- (void)broadcastServerMusicWithSession:(GKSession *)session playerName:(NSString *)name clients:    (NSArray *)clients
{
    self.isServer = YES;

    _session = session;
    _session.available = NO;
    _session.delegate = self;
    [_session setDataReceiveHandler:self withContext:nil];

    CFURLRef     fileURL = (__bridge CFURLRef)[[NSBundle mainBundle] URLForResource:@"mozart"                                                                       withExtension:@"mp3"]; // file URL    
    AudioFile *audioFile = [[AudioFile alloc] initWithURL:fileURL];    

    //no we start sending the data over    
    #define MAX_PACKET_COUNT    4096
    SInt64 currentPacketNumber = 0;
    UInt32 numBytes;
    UInt32 numPacketsToRead;
    AudioStreamPacketDescription    packetDescriptions[MAX_PACKET_COUNT];    

    NSInteger bufferByteSize = 4096;
    if (bufferByteSize < audioFile.maxPacketSize) bufferByteSize = audioFile.maxPacketSize; 
    numPacketsToRead = bufferByteSize/audioFile.maxPacketSize;
    UInt32 numPackets = numPacketsToRead;

    BOOL isVBR = ([audioFile audioFormatRef]->mBytesPerPacket == 0) ? YES : NO;

// this should be in a do while (numPackets < numPacketsToRead) loop.. 
// but i took it out just to narrow down the problem

    NSMutableData *myBuffer = [[NSMutableData alloc] initWithCapacity:numPackets * audioFile.maxPacketSize];

    AudioFileReadPackets (
                          audioFile.fileID,
                          NO,
                          &numBytes,
                          isVBR ? packetDescriptions : 0,
                          currentPacketNumber,
                          &numPackets,
                          &myBuffer
                          );

    NSError *error;        
    if (![session sendDataToAllPeers:packetData withDataMode:GKSendDataReliable error:&error]) 
    {
        NSLog(@"Error sending data to clients: %@", error);
    }

コードを壊しているのはAudioFileReadPackets呼び出しであることは事実です。そのビットをコメントアウトすると正常に動作するからです

xcode 4.3を使用してゾンビのプロファイリングを試みましたが、クラッシュするだけです.コードがクラッシュしたときに壊れていて、gdbコンソールを使用してエラーコードを出力していたときに得た便利なデバッグのヒント..これは私が得たものです:

(lldb) po [$eax className] NSException
error: warning: receiver type 'unsigned int' is not 'id' or interface pointer, consider casting it to 'id'
warning: declaration does not declare anything
error: expected ';' after expression
error: 1 errors parsing expression

しかし、私はそれで多くを行うことができませんでした..何か助けはありますか?

4

1 に答える 1

0

上記のコードには 2 つの問題があることがわかりました。

  1. [audioFile audioFormatRef]->mBytesPerPacket == 0 コンパイラはこれに満足していません.. audioFormatRef を定義するコードを参照すると、mBytesPerPacket フィールドを持つフォーマット構造体へのポインタが返されます..理由はわかりませんただし、上記の構文は機能しません

  2. myBuffer を AudioFileReadPackets 関数 (タイプ mistmach) に提供するべきではありません。むしろ、次のようにする必要があります。

    NSMutableData *myBuffer = [[NSMutableData alloc] initWithCapacity:numPackets * audioFile.maxPacketSize];
    const void *buffer = [myBuffer bytes];
    AudioFileReadPackets (
                          audioFile.fileID,
                          NO,
                          &numBytes,
                          isVBR ? packetDescriptions : 0,
                          currentPacketNumber,
                          &numPackets,
                          buffer
                          );
    

これも効く

void *buffer = [myBuffer mutablebytes];

この投稿を読んで、これら 2 つのオプションの違いを説明してください

于 2012-08-09T12:51:49.647 に答える