Changeset 4617


Ignore:
Timestamp:
Oct 9, 2013 3:34:26 AM (11 years ago)
Author:
ming
Message:

Re #1697: Use AVAudioSession to set audio session category and activate/deactivate audio session

Location:
pjproject/trunk
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia-audiodev/coreaudio_dev.m

    r4609 r4617  
    3636    #include <CoreAudio/CoreAudio.h> 
    3737#else 
    38     #include <AudioToolbox/AudioServices.h> 
     38    #include <AVFoundation/AVAudioSession.h> 
    3939 
    4040    #define AudioDeviceID unsigned 
     
    5252 
    5353    /* Starting iOS SDK 7, Audio Session API is deprecated. */ 
    54     #ifdef __IPHONE_7_0 
    55         #define USE_AUDIO_SESSION_API 0 
    56     #else 
    57         #define USE_AUDIO_SESSION_API 1 
    58     #endif 
     54    #define USE_AUDIO_SESSION_API 0 
    5955#endif 
    6056 
     
    144140    unsigned                     resample_buf_count; 
    145141    unsigned                     resample_buf_size; 
     142     
     143#if !COREAUDIO_MAC 
     144    AVAudioSession              *sess; 
     145#endif 
    146146}; 
    147147 
     
    289289 
    290290        /* Set the device capabilities here */ 
    291 #if USE_AUDIO_SESSION_API != 0 
    292291        cdi->info.caps = PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY | 
    293292                         PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY | 
    294293                         PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING | 
     294#if USE_AUDIO_SESSION_API != 0 
    295295                         PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE | 
    296296                         PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE | 
     297#endif 
    297298                         PJMEDIA_AUD_DEV_CAP_EC; 
    298299        cdi->info.routes = PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER | 
    299300                           PJMEDIA_AUD_DEV_ROUTE_EARPIECE | 
    300301                           PJMEDIA_AUD_DEV_ROUTE_BLUETOOTH; 
    301 #else 
    302         cdi->info.caps = PJMEDIA_AUD_DEV_CAP_EC; 
    303 #endif 
    304302 
    305303        PJ_LOG(4, (THIS_FILE, " dev_id %d: %s  (in=%d, out=%d) %dHz", 
     
    12401238{ 
    12411239    OSStatus ostatus; 
    1242 #if !COREAUDIO_MAC && USE_AUDIO_SESSION_API != 0 
    1243     UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; 
     1240#if !COREAUDIO_MAC 
    12441241    /* We want to be able to open playback and recording streams */ 
    1245     ostatus = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, 
    1246                                       sizeof(audioCategory), 
    1247                                       &audioCategory); 
    1248     if (ostatus != kAudioSessionNoError) { 
     1242    strm->sess = [AVAudioSession sharedInstance]; 
     1243    if ([strm->sess setCategory:AVAudioSessionCategoryPlayAndRecord 
     1244                    error:nil] != YES) 
     1245    { 
    12491246        PJ_LOG(4, (THIS_FILE, 
    1250                    "Warning: cannot set the audio session category (%i)", 
    1251                    ostatus)); 
     1247                   "Warning: cannot set the audio session category")); 
    12521248    }     
    12531249#endif 
     
    17161712            } 
    17171713        } 
    1718 #elif USE_AUDIO_SESSION_API != 0 
    1719         Float32 latency, latency2; 
    1720         UInt32 size = sizeof(Float32); 
    1721  
    1722         if ((AudioSessionGetProperty( 
    1723             kAudioSessionProperty_CurrentHardwareInputLatency, 
    1724             &size, &latency) == kAudioSessionNoError) && 
    1725             (AudioSessionGetProperty( 
    1726             kAudioSessionProperty_CurrentHardwareIOBufferDuration, 
    1727             &size, &latency2) == kAudioSessionNoError)) 
    1728         { 
    1729             strm->param.input_latency_ms = (unsigned) 
    1730                                            ((latency + latency2) * 1000); 
     1714#else 
     1715        if ([strm->sess respondsToSelector:@selector(inputLatency)]) { 
     1716            strm->param.input_latency_ms = 
     1717                (unsigned)(([strm->sess inputLatency] + 
     1718                            [strm->sess IOBufferDuration]) * 1000); 
    17311719            strm->param.input_latency_ms++; 
    1732         } 
     1720        } else 
     1721            return PJMEDIA_EAUD_INVCAP; 
    17331722#endif 
    17341723 
     
    17641753            } 
    17651754        } 
    1766 #elif USE_AUDIO_SESSION_API != 0 
    1767         Float32 latency, latency2; 
    1768         UInt32 size = sizeof(Float32); 
    1769  
    1770         if ((AudioSessionGetProperty( 
    1771             kAudioSessionProperty_CurrentHardwareOutputLatency, 
    1772             &size, &latency) == kAudioSessionNoError) && 
    1773             (AudioSessionGetProperty( 
    1774             kAudioSessionProperty_CurrentHardwareIOBufferDuration, 
    1775             &size, &latency2) == kAudioSessionNoError)) 
    1776         { 
    1777             strm->param.output_latency_ms = (unsigned) 
    1778                                             ((latency + latency2) * 1000); 
     1755#else 
     1756        if ([strm->sess respondsToSelector:@selector(outputLatency)]) { 
     1757            strm->param.output_latency_ms = 
     1758            (unsigned)(([strm->sess outputLatency] + 
     1759                        [strm->sess IOBufferDuration]) * 1000); 
    17791760            strm->param.output_latency_ms++; 
    1780         } 
     1761        } else 
     1762            return PJMEDIA_EAUD_INVCAP; 
    17811763#endif 
    17821764        *(unsigned*)pval = (++strm->param.output_latency_ms * 2); 
    17831765        return PJ_SUCCESS; 
    1784 #if COREAUDIO_MAC || USE_AUDIO_SESSION_API != 0 
    17851766    } else if (cap==PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING && 
    17861767               (strm->param.dir & PJMEDIA_DIR_PLAYBACK)) 
    17871768    { 
     1769#if COREAUDIO_MAC 
    17881770        OSStatus ostatus; 
    17891771        Float32 volume; 
     
    17911773 
    17921774        /* Output volume setting */ 
    1793 #if COREAUDIO_MAC 
    17941775        ostatus = AudioUnitGetProperty (strm->io_units[1] ? strm->io_units[1] : 
    17951776                                        strm->io_units[0], 
     
    18011782        if (ostatus != noErr) 
    18021783            return PJMEDIA_AUDIODEV_ERRNO_FROM_COREAUDIO(ostatus); 
    1803 #elif USE_AUDIO_SESSION_API != 0 
    1804         ostatus = AudioSessionGetProperty( 
    1805                   kAudioSessionProperty_CurrentHardwareOutputVolume, 
    1806                   &size, &volume); 
    1807         if (ostatus != kAudioSessionNoError) { 
    1808             return PJMEDIA_AUDIODEV_ERRNO_FROM_COREAUDIO(ostatus); 
    1809         } 
    1810 #endif 
    18111784 
    18121785        *(unsigned*)pval = (unsigned)(volume * 100); 
    18131786        return PJ_SUCCESS; 
     1787#else 
     1788        if ([strm->sess respondsToSelector:@selector(outputVolume)]) { 
     1789            *(unsigned*)pval = (unsigned)([strm->sess outputVolume] * 100); 
     1790            return PJ_SUCCESS; 
     1791        } else 
     1792            return PJMEDIA_EAUD_INVCAP; 
    18141793#endif 
    18151794 
     
    19331912         
    19341913        return PJ_SUCCESS; 
    1935     } 
    1936  
    1937 #if USE_AUDIO_SESSION_API != 0 
    1938  
    1939     else if ((cap==PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY && 
     1914    } else if ((cap==PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY && 
    19401915         (strm->param.dir & PJMEDIA_DIR_CAPTURE)) || 
    19411916        (cap==PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY && 
    19421917         (strm->param.dir & PJMEDIA_DIR_PLAYBACK))) 
    19431918    { 
    1944         Float32 bufferDuration = *(unsigned *)pval; 
    1945         OSStatus ostatus; 
     1919        NSTimeInterval duration = *(unsigned *)pval; 
    19461920        unsigned latency; 
    1947          
     1921 
    19481922        /* For low-latency audio streaming, you can set this value to 
    19491923         * as low as 5 ms (the default is 23ms). However, lowering the 
    19501924         * latency may cause a decrease in audio quality. 
    19511925         */ 
    1952         bufferDuration /= 1000; 
    1953         ostatus = AudioSessionSetProperty( 
    1954                       kAudioSessionProperty_PreferredHardwareIOBufferDuration, 
    1955                       sizeof(bufferDuration), &bufferDuration); 
    1956         if (ostatus != kAudioSessionNoError) { 
     1926        duration /= 1000; 
     1927        if ([strm->sess setPreferredIOBufferDuration:duration error:nil] 
     1928            != YES) 
     1929        { 
    19571930            PJ_LOG(4, (THIS_FILE, 
    1958                        "Error: cannot set the preferred buffer duration (%i)", 
    1959                        ostatus)); 
    1960             return PJMEDIA_AUDIODEV_ERRNO_FROM_COREAUDIO(ostatus); 
     1931                       "Error: cannot set the preferred buffer duration")); 
     1932            return PJMEDIA_EAUD_INVOP; 
    19611933        } 
    19621934         
     
    19651937         
    19661938        return PJ_SUCCESS; 
    1967     } else if (cap==PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE && 
     1939    } 
     1940 
     1941#if USE_AUDIO_SESSION_API != 0 
     1942 
     1943    else if (cap==PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE && 
    19681944               (strm->param.dir & PJMEDIA_DIR_CAPTURE)) 
    19691945    { 
     
    20262002    } 
    20272003 
    2028 #if !COREAUDIO_MAC && USE_AUDIO_SESSION_API != 0 
    2029     AudioSessionSetActive(true); 
     2004#if !COREAUDIO_MAC 
     2005    if ([stream->sess setActive:true error:nil] != YES) { 
     2006        PJ_LOG(4, (THIS_FILE, "Warning: cannot activate audio session")); 
     2007    } 
    20302008#endif 
    20312009     
     
    20842062    pj_mutex_unlock(stream->cf->mutex); 
    20852063 
    2086 #if !COREAUDIO_MAC && USE_AUDIO_SESSION_API != 0 
    2087     if (should_deactivate) 
    2088         AudioSessionSetActive(false); 
     2064#if !COREAUDIO_MAC 
     2065    if (should_deactivate) { 
     2066        if ([stream->sess setActive:false error:nil] != YES) { 
     2067            PJ_LOG(4, (THIS_FILE, "Warning: cannot deactivate audio session")); 
     2068        } 
     2069    } 
    20892070#endif 
    20902071 
  • pjproject/trunk/pjsip-apps/src/pjsua/ios/ipjsua.xcodeproj/project.pbxproj

    r4590 r4617  
    1616                3ADCCD30172E40120007BE8E /* pjsua_app_legacy.c in Sources */ = {isa = PBXBuildFile; fileRef = 3ADCCD2B172E40120007BE8E /* pjsua_app_legacy.c */; }; 
    1717                3ADCCD31172E40120007BE8E /* pjsua_app.c in Sources */ = {isa = PBXBuildFile; fileRef = 3ADCCD2C172E40120007BE8E /* pjsua_app.c */; }; 
     18                3ADFCCFD1803B00600B0A097 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3ADFCCFC1803B00600B0A097 /* AVFoundation.framework */; }; 
    1819                3AF0580916F050770046B835 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AF0580816F050770046B835 /* UIKit.framework */; }; 
    1920                3AF0580B16F050770046B835 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AF0580A16F050770046B835 /* Foundation.framework */; }; 
     
    5859                3ADCCD2B172E40120007BE8E /* pjsua_app_legacy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pjsua_app_legacy.c; path = ../../pjsua_app_legacy.c; sourceTree = "<group>"; }; 
    5960                3ADCCD2C172E40120007BE8E /* pjsua_app.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pjsua_app.c; path = ../../pjsua_app.c; sourceTree = "<group>"; }; 
     61                3ADFCCFC1803B00600B0A097 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 
    6062                3AF0580416F050770046B835 /* ipjsua.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ipjsua.app; sourceTree = BUILT_PRODUCTS_DIR; }; 
    6163                3AF0580816F050770046B835 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 
     
    101103                        buildActionMask = 2147483647; 
    102104                        files = ( 
     105                                3ADFCCFD1803B00600B0A097 /* AVFoundation.framework in Frameworks */, 
    103106                                3A92069316F1DEA500D49F96 /* CFNetwork.framework in Frameworks */, 
    104107                                3A92068F16F1DE7100D49F96 /* AudioToolbox.framework in Frameworks */, 
     
    164167                        isa = PBXGroup; 
    165168                        children = ( 
     169                                3ADFCCFC1803B00600B0A097 /* AVFoundation.framework */, 
    166170                                3A92069216F1DEA500D49F96 /* CFNetwork.framework */, 
    167171                                3A92068E16F1DE7100D49F96 /* AudioToolbox.framework */, 
Note: See TracChangeset for help on using the changeset viewer.