Track

  64 AudioFlinger::ThreadBase::TrackBase::TrackBase(                                 
  65             ThreadBase *thread,                                                 
  66             const sp<Client>& client,                                           
  67             uint32_t sampleRate,                                                
  68             audio_format_t format,                                              
  69             audio_channel_mask_t channelMask,                                   
  70             size_t frameCount,                                                  
  71             void *buffer,                                                       
  72             int sessionId,                                                      
  73             int clientUid,                                                      
  74             IAudioFlinger::track_flags_t flags,                                 
  75             bool isOut,                                                         
  76             alloc_type alloc,                                                   
  77             track_type type)                                                    
  78     :   RefBase(), 
 115     size_t size = sizeof(audio_track_cblk_t);                                   
 116     size_t bufferSize = (buffer == NULL ? roundup(frameCount) : frameCount) * mFrameSize;
 117     if (buffer == NULL && alloc == ALLOC_CBLK) {                                
 118         size += bufferSize;                                                     
 119     }   
  121     if (client != 0) {                                                          
 122         mCblkMemory = client->heap()->allocate(size);                           
 123         if (mCblkMemory == 0 ||                                                 
 124                 (mCblk = static_cast<audio_track_cblk_t *>(mCblkMemory->pointer())) == NULL) {
 125             ALOGE("not enough memory for AudioTrack size=%u", size);            
 126             client->heap()->dump("AudioTrack");                                 
 127             mCblkMemory.clear();                                                
 128             return;                                                                                                                     
 129         }  
 ...
 164         case ALLOC_CBLK:                                                        
 165             // clear all buffers                                                
 166             if (buffer == NULL) {                                               
 167                 mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);            
 168                 memset(mBuffer, 0, bufferSize);                                 
 169             } else {                                                            
 170                 mBuffer = buffer;                                               
 171 #if 0                                                                           
 172                 mCblk->mFlags = CBLK_FORCEREADY;    // FIXME hack, need to fix the track ready logic
 173 #endif                                                                          
 174             }                                                                   
 175             break;                                                              
 176         case ALLOC_LOCAL:                                                       
 177             mBuffer = calloc(1, bufferSize);                                    
 178             break;                                                              
 179         case ALLOC_NONE:                                                        
 180             mBuffer = buffer;                                                                                                           
 181             break;  

说明:
117行,如果应用层传入NULL,则size会多bufferSize。
126行,会分配size大小内存
164和177,如果内存是track分配的话,则mBuffer跳过控制头指向分配的内存;如果是应用程序,则mBuffer指向应用层的buffer。

 373 AudioFlinger::PlaybackThread::Track::Track(                                                                                             
 374             PlaybackThread *thread,                                             
 375             const sp<Client>& client,                                           
 376             audio_stream_type_t streamType,                                     
 377             uint32_t sampleRate,                                                
 378             audio_format_t format,                                              
 379             audio_channel_mask_t channelMask,                                   
 380             size_t frameCount,                                                  
 381             void *buffer,                                                       
 382             const sp<IMemory>& sharedBuffer,                                    
 383             int sessionId,                                                      
 384             int uid,                                                            
 385             IAudioFlinger::track_flags_t flags,                                 
 386             track_type type) 
 ......
 421     if (sharedBuffer == 0) {                                                    
 422         mAudioTrackServerProxy = new AudioTrackServerProxy(mCblk, mBuffer, frameCount,
 423                 mFrameSize, !isExternalTrack(), sampleRate);                    
 424     } else {                                                                    
 425         mAudioTrackServerProxy = new StaticAudioTrackServerProxy(mCblk, mBuffer, frameCount,
 426                 mFrameSize);                                                    
 427     }                                                                           
 428     mServerProxy = mAudioTrackServerProxy;  
 ...
 }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值