i Universitas Kristen Maranatha
PERANCANGAN DAN REALISASI APLIKASI
SOFTPHONE PADA JARINGAN VOIP BERBASIS SIP
UNTUK SMARTPHONE ANDROID
Disusun Oleh:
Nama : Richard
NRP : 0922001
Jurusan Teknik Elektro
Universitas Kristen Maranatha
Email : corser_speed@yahoo.co.id
ABSTRAK
Kebutuhan akan informasi dan komunikasi semakin meningkat akibat
berkembangnya teknologi. Sehingga dibutuhkan media dan sarana komunikasi
yang akurat, cepat, efisien dan hemat biaya. Salah satunya media komunikasi
yang dikembangkan menggunakan jaringan internet yaitu
Voice Over Internet
Protocol
(
VoIP
).VoIP merupakan teknologi yang dapat menggabungkan antara
jaringan telepon dengan komunikasi data.
Pada tugas akhir ini direalisasikan jaringan VoIP dengan server Asterisk
dan aplikasi
softphone
berbasis Android. Komunikasi jaringan menggunakan
koneksi Wi-Fi yang menghubungkan server dan
client (user)
. Antar
client
baik
yang menggunakan laptop yang terinstal
softphone
x-lite atau menggunakan
smartphone
Android yang terinstal
softphone
SIP yang telah dirancang dapat
berkomunikasi suara dalam satu jaringan yang terhubung Wi-Fi
Perancangan jaringan VoIP dan aplikasi
softphone
SIP pada
smartphone
Android berhasil direalisasikan dalam satu jaringan, penyebaran koneksinya
terbatas pada kemampuan router menjangkau wilayah. Aplikasi
softphone
pada
Android hanya dapat digunakan pada server Asterisk yang penggunaannya
disesuaikan dengan kebutuhan server untuk komunikasi suara saja.
ii Universitas Kristen Maranatha
DESIGNING AND REALIZATION OF SOFTPHONE
APPLICATIONS ON SIP-BASED VOIP NETWORK
FOR ANDROID SMARTPHONE
Composed By:
Name : Richard
NRP : 0922001
Electrical Engineering Department
Maranatha Christian University
Email : corser_speed@yahoo.co.id
ABSTRACT
The need for information and communication are increasing due to the
development of technology. So it takes media and means of communication of
accurate, fast, efficient and cost-effective. One of them developed communication
media that uses the internet is Voice Over Internet Protocol (VoIP). VoIP is a
technology that can combine between telephone networks with data
communications.
In this final project realized VoIP network with an Asterisk server and
Android-based softphone applications. Communications network using Wi-Fi
connection that connects the server and client (user). Between client whether
using a laptop installed x-lite softphone or using a smartphone installed Android
SIP softphone which has been designed to voice communication in one network
are connected Wi-Fi.
Design a VoIP network and SIP softphone application on Android
smartphones successfully realized in the one network, spread of connection is
limited to the ability the router reach the area. Softphone applications on Android
can only be used on the Asterisk server, its use matched with the needs of the
server just for voice communication.
iii Universitas Kristen Maranatha
DAFTAR ISI
Halaman
LEMBAR PENGESAHAN
PERNYATAAN ORISINALITAS LAPORAN PENELITIAN
PERNYATAAN PUBLIKASI LAPORAN KERJA PRAKTEK
KATA PENGANTAR
ABSTRAK ...
i
ABSTRACT ...
ii
DAFTAR
ISI ...
iii
DAFTAR
GAMBAR ...
vi
DAFTAR
TABEL ...
viii
BAB
I
PENDAHULUAN
I.1 Latar Belakang Masalah ... 1
I.2 Identifikasi Masalah ... 2
I.3 Rumusan Masalah ... 2
I.4 Tujuan ... 2
I.5 Pembatasan Masalah ... 2
I.6 Spesifikasi Alat ... 3
I.7 Sistematika Penulisan... 3
BAB
II
LANDASAN TEORI
II.1 VoIP ... 5
II.1.1 Komponen VoIP ... 6
II.1.2 Protokol-Protokol VoIP
...
7
II.1.3 Codec Pendukung VoIP
...
10
II.2 SIP ... 11
II.2.1 Fungsi-Fungsi SIP ... 11
II.2.2 Elemen Jaringan SIP
...
12
II.2.3 Metoda Perintah SIP
...
13
II.3 Wi-Fi ... 16
II.3.1 Mode Akses koneksi Wi-Fi
...
17
II.4 Perangkat LAN ... 18
II.4.1 Modem
...
18
iv Universitas Kristen Maranatha
II.4.3 Hub
...
19
II.4.4 Switch
...
19
II.4.5 Router
...
20
II.4.6 Bridge Jaringan
...
20
II.4.7 Access Point
...
20
II.5 Softphone ... 21
II.6 Asterisk ... 22
II.6.1 Arsitektur Asterisk
...
22
II.6.2 Konfigurasi Asterisk
...
23
II.6.3 Perintah Asterisk
...
27
II.7 Android ... 28
II.7.1 Arsitektur Android
...
29
II.7.2 Android SDK
...
32
II.7.3 Eclipse IDE
...
33
II.7.4 ADT (
Android Development Tools
)
...
33
BAB
III
PERANCANGAN DAN REALISASI
III.1
Hardware
dan
Software ...
34
III.2 Perancangan Sistem VoIP
...
34
III.2.1 Asterisk 1.4.17
...
36
III.2.1.1 Instalasi Pada Linux Open Suse... 36
III.2.1.2 Konfigurasi Sip.conf ... 39
III.2.1.3 Konfigurasi Extensions.conf
...
41
III.2.2 X-Lite 3.0 ... 42
III.3 Perancangan Aplikasi
...
45
III.3.1 Cara Kerja
...
46
III.3 Tampilan
Interface
Aplikasi
...
49
BAB
IV
DATA PENGAMATAN DAN ANALISA
IV.1
Cara Pengamatan
...
56
IV.2 Pengamatan Paket Data
...
57
IV.3 Pengamatan Keberhasilan dan Delay
...
62
v Universitas Kristen Maranatha
V.2
Saran...
71
DAFTAR PUSTAKA ...
72
LAMPIRAN A SPESIFIKASI ALAT
vi Universitas Kristen Maranatha
DAFTAR GAMBAR
Halaman
Gambar 2.1 Format paket VoIP IPv4 ... 6
Gambar 2.2 Diagram VoIP ... 7
Gambar 2.3 Mekanisme Protokol TCP/IP ... 8
Gambar 2.4 Diagram arsitektur panggilan SIP
connected
... 14
Gambar 2.5 Diagram arsitektur panggilan SIP server
error
...
15
Gambar 2.6 Diagram arsitektur panggilan SIP
busy
... 16
Gambar 2.7 Topologi VoIP Asterisk ... 27
Gambar 2.8 Arsitektur Android ... 32
Gambar 3.1 Skema Jaringan yang digunakan
...
35
Gambar 3.2 Router yang digunakan
...
36
Gambar 3.3 Flowchart Koneksi Server Asterisk
...
38
Gambar 3.4 Tampilan asterisk
running
/aktif pada terminal SLES ... 39
Gambar 3.5 Tampilan folder /etc/asterisk/sip.conf pada mc
...
40
Gambar 3.6 Tampilan folder /etc/asterisk/extensions.conf pada mc ... 42
Gambar 3.7 Konfigurasi SIP
account
... 44
Gambar 3.8 Tampilan X-Lite yang telah teregister pada SIP server ... 44
Gambar 3.9 Flowchart proses register client aplikasi ... 47
Gambar 3.10 Flowchart proses melakukan panggilan (
dialing)
... 48
Gambar 3.11 Flowchart proses panggilan datang
(incoming call) ...
49
Gambar 3.12 Tampilan awal aplikasi ... 50
Gambar 3.13 Tampilan
input number ...
50
Gambar 3.14 Tampilan pilihan menu aplikasi
...
51
Gambar 3.15 Tampilan isi menu
...
51
Gambar 3.16 Tampilan menu SIP account
...
52
Gambar 3.17 Tampilan menu audio codec ... 52
Gambar 3.18 Tampilan saat
dialing
... 53
Gambar 3.19 Tampilan saat proses komunikasi ... 53
Gambar 3.20 Tampilan akhir komunikasi ... 54
Gambar 3.21 Tampilan saat panggilan masuk ... 54
Gambar 3.22 Tampilan
message dialog
saat komunikasi Wi-Fi
off
... 55
Gambar 4.1 Tampilan Asterisk saat registrasi
client ...
57
Gambar 4.2 Tampilan capture protokol SIP
...
58
vii Universitas Kristen Maranatha
viii Universitas Kristen Maranatha
DAFTAR TABEL
Halaman
Tabel 2.1 Spesifikasi Wi-Fi
...
17
Tabel 4.1 Level sinyal Wi-Fi
client ...
63
Tabel 4.2 Pengamatan
dialing
client
104 ke 102 dan sebaliknya
...
63
Tabel 4.3 Pengamatan
dialing
client 104 ke 101 dan sebaliknya ... 64
Tabel 4.4 Pengamatan
dialing
client
102 ke 101 dan sebaliknya ... 65
Tabel 4.5 Pengamatan
dialing
client
105 ke 101 dan sebaliknya ... 65
Tabel 4.6 Pengamatan
dialing
client
105 ke 104 dan sebaliknya ... 66
Tabel 4.7 Percobaan 1, delay saat 2
client
melakukan komunikasi ... 67
Tabel 4.8 Percobaan 2, delay saat 2
client
melakukan komunikasi ... 68
Tabel 4.9 Percobaan 1, delay saat 4
client
melakukan komunikasi ... 69
LAM PIRAN A
1.
Spesifikasi TP-Link TL-WR841ND AP Router N Series
FITUR PERANGKAT KERAS
Tampilan
4 10/100Mbps LAN PORTS
1 10/100Mbps WAN PORT
Tombol
Quick Setup Security Button
Reset Button
Catu Daya Eksternal
9VDC / 0.6A
Standar Nirkabel (Wireless)
IEEE 802.11n, IEEE 802.11g, IEEE 802.11b
Antena
2*5dBi Detachable Omni Directional Antenna (RP-SMA)
Dimensi ( W x D x H )
7.6 x 5.1 x 1.3 in.(192 x 130 x 33 mm)
FITUR WIRELESS
Frekuensi
2.4-2.4835GHz
Tingkat Signal
11n: Up to 300Mbps(dynamic)
11g: Up to 54Mbps(dynamic)
11b: Up to 11Mbps(dynamic)
EIRP
<20dBm(EIRP)
Penerimaan Sensitivitas
270M: -68dBm@10% PER
130M: -68dBm@10% PER
108M: -68dBm@10% PER
54M: -68dBm@10% PER
11M: -85dBm@8% PER
6M: -88dBm@10% PER
1M: -90dBm@8% PER
Fungsi Wireless
Enable/Disable Wireless Radio, WDS Bridge, WMM, Wireless
Statistics
Keamanan Wireless
64/128/152-bit WEP / WPA / WPA2,WPA-PSK / WPA2-PSK
FITUR PERANGKAT LUNAK
Tipe WAN
Dynamic IP/Static IP/PPPoE/
PPTP(Dual Access)/L2TP(Dual Access)/BigPond
DHCP
Server, Client, DHCP Client List,
Address Reservation
Quality of Service
WMM, Bandwidth Control
Port Forwarding
Virtual Server,Port Triggering, UPnP, DMZ
Dynamic DNS
DynDns, Comexe, NO-IP
VPN Pass-Through
PPTP, L2TP, IPSec (ESP Head)
Access Control
Parental Control, Local Management Control, Host List, Access
Schedule, Rule Management
Keamanan Firewall
DoS, SPI Firewall
IP Address Filter/MAC Address Filter/Domain Filter
IP and MAC Address Binding
Manajemen
Access Control
Local Management
Remote Management
Lainnya
Sertifikasi
CE, FCC, RoHS
Isi Paket
Wireless N Rotuer TL-WR841ND
2 Detachable Omni Directional Antennas
Power supply unit
Resource CD
Quick Installation Guide
Kebutuhan Sistem
Microsoft® Windows® 98SE, NT, 2000, XP, Vista™ or
Windows 7, MAC® OS, NetWare®, UNIX® or Linux.
Lingkungan
Operating Temperature: 0
℃
~40
℃
(32
℉
~104
℉
)
2.
Spesifikasi Samsung Galaxy W I18150
GENERAL
Network
2G GSM 850 / 900 / 1800 / 1900 3G HSDPA
LAYAR
Tipe
Capacitive touchscreen, 16M colors
Ukuran
480 x 800 pixels, 3.7 inches (~252 ppi pixel
density) - Multi-touch input method -
Accelerometer sensor for UI auto-rotate -
Touch-sensitive controls - Proximity sensor
for auto turn-off
DIMENSI
Ukuran/Berat
115.5 x 59.8 x 11.5 mm / 109.9 g
AUDIO
Fitur
Vibration
MP3, WAV ringtones
Jack
3,5mm Jack Audio
Speakerphone
Ya
MEMORY
Internal
512 MB RAM, 2 GB ROM
Eksternal
microSD, up to 32GB
DATA
3G
HSDPA, 14.4 Mbps; HSUPA, 5.76 Mbps
EDGE
Ya
GPRS
Ya
WLAN
Wi-Fi 802.11 b/g/n, Wi-Fi hotspot
Bluetooth
Ya, v3.0 with A2DP
Infrared
Tidak
USB/Port
Ya, v2.0 microUSB
KAMERA
Primer
5 MP, 2592x1944 pixels, autofocus, LED
flash - Geo-tagging, touch focus, face and
smile detection
Sekunder
Ya, VGA
Video Record
Ya, 720p@30fps
BATERAI
Tipe
Standard battery, Li-Ion 1500 mAh
Standby
Up to 570 h (2G) / Up to 420 h (3G)
Talk Time
Up to 17 h 50 min (2G) / Up to 8 h 20 min
(3G)
FITUR
OS
Android OS, v2.3 (Gingerbread)
CPU
1.4 GHz Scorpion processor, Adreno 205
GPU, Qualcomm MSM8255T Snapdragon
Browser
HTML
GPS
Ya, with A-GPS support
Messaging
SMS(threaded view), MMS, Email, Push
Mail, IM, RSS
Java
via Java MIDP emulator, Fitur tambahan:
Stereo FM radio with RDS - SNS integration
- Digital compass - Organizer - Image/video
editor - Document editor (Word, Excel,
PowerPoint, PDF) - Google Search, Maps,
Gmail, YouTube, Calendar, Google Talk,
Picasa integration - Adobe Flash support -
Voice memo/dial/commands - Predictive text
input (Swype)
FITUR
LAIN
Multiple SIM
Tidak
Video Player
- MP4/DivX/XviD/WMV/H.264/H.263
player
MP3 Player
- MP3/WAV/eAAC+ player
Audio Record
Ya
TV
3.
Samsung Galaxy Tab2 7.0 P3100
GENERAL
Network
GSM 850 / 900 / 1800 / 1900 ,3G HSDPA 900 /1900 /
2100
LAYAR
Tipe
PLS LCD capacitive touchscreen, 16M colors
Ukuran
600 x 1024 pixels, 7.0 inches (~170 ppi pixel density,
Multitouch, TouchWiz UX UI
DIMENSI
Ukuran/Berat
193.7 x 122.4 x 10.5 mm / 344 g
AUDIO
Fitur
Vibration
MP3, WAV ringtones
Jack
3.5mm jack audio
Speakerphone
Ya
MEMORY
Internal
16 GB storage, 1GB RAM
Eksternal
microSD, up to 64 GB
DATA
3G
HSDPA, 21 Mbps; HSUPA, 5.76 Mbps
EDGE
Ya
GPRS
Ya
WLAN
Wi-Fi 802.11 a/b/g/n, DLNA, Wi-Fi Direct, dual-band
,Wi-Fi hotspot
Bluetooth
v3.0 with A2DP, HS
Infrared
Tidak
USB/Port
microUSB v2.0, USB On-the-go support
KAMERA
Primer
3.15 MP, 2048x1536 pixels, autofocus
Sekunder
VGA
Video Record
1080p@30fps
BATERAI
Tipe
Standard battery, Li-Ion 4000 mAh
Standby
-
Talk Time
-
FITUR
OS
Android OS, v4.0.3 (Ice Cream Sandwich)
CPU
TI OMAP 4430, CPU Dual-core 1 GHz, GPU PowerVR
SGX540
Browser
HTML5, Adobe Flash
GPS
Ya, A-GPS
Messaging
SMS(threaded view), MMS, Email, Push Email, IM, RS
Java
via Java MIDP emulator, fitur tambahan: - TV Out - SNS
integration- Organizer - Image/video editor - Quickoffice
HD editor/viewer - Google Search, Maps, Gmail, YouTube,
Calendar, Google Talk, Picasa integration - Voice memo -
Predictive text input (Swype)
FITUR
LAIN
Multiple SIM
Tidak
Video Player
MP4/DivX/Xvid/H.264/H.263/WMV player
MP3 Player
MP3/WAV/eAAC+/WMA/AC3/Flac player
Audio Record
Ya
4.
Smartfren Andromax U 4.5 LE
General
Network
GSM 850 / 900 / 1800 / 1900, CDMA 2000 1x, EVDO Rev A 800/1900
Mhz
Layar
Type
IPS LCD capacitive touchscreen, 16M colors
Ukuran
4.5
″ IPS Display with 540×960 pixels (256 ppi pixels density)
Multitouch
Ya
Proteksi
Tidak
Dimensi
Ukuran/Berat 130 x 66 x 9mm / 140 gram
Audio
Fitur
Vibration, MP3 Ringtones
Jack
3,5 mm Jack Audio
Speakerphone Ya
Memory
Internal
4 GB, 1 GB RAM
Eksternal
Micro SD Card Slot, up to 32 GB
Data
GPRS
Class B
EDGE
Up to 236.8 kbps
3G
EVDO Rev. A up to 3.1 Mbps
WLAN
Wi-Fi 802.11 a/b/g/n, Wi-Fi hotspot
Bluetooth
Ya, with A2DP
NFC
Tidak
USB/Port
microUSB v2.0
Kamera
Primer
8 MP, 3200?2400 piksel, autofocus, LED flash; Geo-tagging
Sekunder
2 MP
Video Record Ya, Video HD 720p
Baterai
Tipe
Li-Ion 1800mAh
Standby
-
Talk Time
-
Fitur
OS
Android OS, v4.1.2 Jelly Bean
CPU
Prosesor Qualcomm Snapdragon quad core 1.2 Ghz, Adreno 203 GPU
Messaging
SMS (threaded view), MMS, Email, IM, Push Email
Browser
HTML5
Radio
FM radio
GPS
Ya, with A-GPS
Java
Via Java Emulator, Fitur tambahan: Stereo FM radio with RDS,
Organizer (kalender, kalkulator, clock, voice recorder, Google Drive,
Voice Dialer), Viki, VMS, Play Movies, Smartfren Mobile, Smart
Pustakaoogle Maps, Google Play (Android Market), Gmail, Google
Search, Gtalk,
AndroidManifest.xml
<?xml ver si on=" 1. 0" enc odi ng=" ut f - 8" ?>
<mani f est xml ns: andr oi d=" ht t p: / / schemas. andr oi d. com/ apk/ r es/ andr oi d"
package=" or g. si pdr oi d. s i pua"
andr oi d: ver si onName=" 2. 5 bet a"
andr oi d: ver si onCode=" 88"
andr oi d: i nst al l Locat i on=" aut o">
<uses- sdk andr oi d: mi nSdkVer si on=" 8" andr oi d: t ar get SdkVer s i on=" 10" andr oi d: maxSdk Ver si on=" 15"/ > <suppor t s- sc r eens
andr oi d: nor mal Scr eens=" t r ue"
andr oi d: smal l Scr eens=" t r ue"
andr oi d: l ar geScr eens=" t r ue"
andr oi d: anyDensi t y=" f al s e" / >
<uses- f eat ur e andr oi d: name=" andr oi d. har dwar e. bl uet oot h" andr oi d: r equi r ed=" f al se"/ > <uses- f eat ur e andr oi d: name=" andr oi d. har dwar e. l ocat i on" andr oi d: r equi r ed=" f al se"/ > <uses- f eat ur e andr oi d: name=" andr oi d. har dwar e. l ocat i on. gps " andr oi d: r equi r ed=" f al se"/ > <uses- f eat ur e andr oi d: name=" andr oi d. har dwar e. t el ephony" andr oi d: r equi r ed=" f al se"/ > <uses- f eat ur e andr oi d: name=" andr oi d. har dwar e. t ouchscr een" andr oi d: r equi r ed=" f al s e"/ > <uses- f eat ur e andr oi d: name=" andr oi d. har dwar e. wi f i " andr oi d: r equi r ed=" f al se"/ > <uses- f eat ur e andr oi d: name=" andr oi d. har dwar e. c amer a" andr oi d: r equi r ed=" f al se"/ > <appl i cat i on andr oi d: i c on=" @dr awabl e/ ast er i sk" andr oi d: l abel =" @st r i ng/ app_name"> <act i vi t y andr oi d: name=" or g. si pdr oi d. s i pua. ui . Si pdr oi d" andr oi d: l abel =" @st r i ng/ app_name"
andr oi d: l aunchMode=" si ngl eI nst ance"
andr oi d: conf i gChanges=" or i ent at i on| keyboar dHi dden"> <i nt ent - f i l t er >
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. MAI N" / > <cat egor y andr oi d: name=" andr oi d. i nt ent . cat egor y . LAUNCHER" / > </ i nt ent - f i l t er >
</ ac t i vi t y>
<act i vi t y andr oi d: name=" or g. si pdr oi d. s i pua. ui . PSTN" andr oi d: l abel =" @st r i ng/ pst n_name"
andr oi d: i con=" @dr awabl e/ i c_l auncher _phone"> <i nt ent - f i l t er >
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. SENDTO" / > <cat egor y andr oi d: name=" andr oi d. i nt ent . cat egor y . DEFAULT" / > <dat a andr oi d: scheme=" sms" / >
<dat a andr oi d: scheme=" smst o" / > </ i nt ent - f i l t er >
</ ac t i vi t y>
<act i vi t y andr oi d: name=" or g. si pdr oi d. s i pua. ui . SI P" andr oi d: l abel =" @st r i ng/ app_name"> <i nt ent - f i l t er >
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. SENDTO" / > <cat egor y andr oi d: name=" andr oi d. i nt ent . cat egor y . DEFAULT" / > <dat a andr oi d: scheme=" sms" / >
<dat a andr oi d: scheme=" smst o" / > </ i nt ent - f i l t er >
</ ac t i vi t y>
<act i vi t y andr oi d: name=" or g. si pdr oi d. s i pua. ui . Aut oAnswer " andr oi d: l abel =" @st r i ng/ app_name"/ > <act i vi t y andr oi d: name=" or g. si pdr oi d. s i pua. ui . ChangeAcc ount " andr oi d: l abel =" @s t r i ng/ app_name"/ > <act i vi t y andr oi d: name=" or g. si pdr oi d. s i pua. ui . SI PUr i " andr oi d: l abel =" @st r i ng/ app_name"
andr oi d: t heme=" @andr oi d: st yl e/ Theme. Di al og"> <i nt ent - f i l t er >
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. CALL" / > <cat egor y andr oi d: name=" andr oi d. i nt ent . cat egor y . DEFAULT" / > <dat a andr oi d: scheme=" si p" / >
<dat a andr oi d: scheme=" si pdr oi d" / > </ i nt ent - f i l t er >
<i nt ent - f i l t er >
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. SENDTO" / > <act i on andr oi d: name=" andr oi d. i nt ent . act i on. VI EW" / > <cat egor y andr oi d: name=" andr oi d. i nt ent . cat egor y . DEFAULT" / > <cat egor y andr oi d: name=" andr oi d. i nt ent . cat egor y . BROWSABLE" / > <dat a andr oi d: scheme=" i mt o" / >
<dat a andr oi d: scheme=" si p" / > </ i nt ent - f i l t er >
<i nt ent - f i l t er >
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. CALL_PRI VI LEGED" / > <cat egor y andr oi d: name=" andr oi d. i nt ent . cat egor y . DEFAULT" / > <dat a andr oi d: scheme=" si p" / >
</ i nt ent - f i l t er > </ ac t i vi t y>
<act i vi t y andr oi d: name=" or g. si pdr oi d. s i pua. ui . Act i vi t y2" andr oi d: l abel =" @st r i ng/ app_name"
andr oi d: excl udeFr omRecent s=" t r ue" andr oi d: t ask Af f i ni t y=" "/ >
<act i vi t y andr oi d: name=" or g. si pdr oi d. s i pua. ui . Set t i ngs" andr oi d: l abel =" @st r i ng/ app_name"
andr oi d: conf i gChanges=" or i ent at i on| keyboar dHi dden"> andr oi d: excl udeFr omRecent s=" t r ue" andr oi d: t ask Af f i ni t y=" " > </ ac t i vi t y>
<act i vi t y
andr oi d: name=" or g. si pdr oi d. codecs. Codecs$CodecSet t i ngs "
andr oi d: l abel =" @st r i ng/ app_name" > </ ac t i vi t y>
<act i vi t y andr oi d: name=" or g. si pdr oi d. s i pua. ui . Vi deoCamer a" andr oi d: l abel =" @st r i ng/ menu_vi deo"
andr oi d: excl udeFr omRecent s=" t r ue" andr oi d: t askAf f i ni t y=" "
andr oi d: t heme=" @andr oi d: st yl e/ Theme. Bl ack. NoTi t l eBar . Ful l scr een"
andr oi d: scr eenOr i ent at i on=" l andscape"
andr oi d: cl ear TaskOnLaunch=" t r ue"
andr oi d: conf i gChanges=" or i ent at i on| key boar dHi dden"> </ ac t i vi t y>
<act i vi t y andr oi d: name=" or g. si pdr oi d. s i pua. ui . I nCal l Scr een" andr oi d: l abel =" @st r i ng/ app_name"
andr oi d: excl udeFr omRecent s=" t r ue" andr oi d: t askAf f i ni t y=" "
<r ecei ver andr oi d: name=" or g. si pdr oi d. si pua. ui . OneShot Al ar m"/ > <r ecei ver andr oi d: name=" or g. si pdr oi d. si pua. ui . OneShot Al ar m2"/ > <r ecei ver andr oi d: name=" or g. si pdr oi d. si pua. ui . LoopAl ar m"/ > <r ecei ver andr oi d: name=" or g. si pdr oi d. si pua. ui . OwnWi f i "/ > <r ecei ver andr oi d: name=" or g. si pdr oi d. si pua. ui . OneShot Locat i on"/ > <r ecei ver andr oi d: name=" or g. si pdr oi d. si pua. ui . LoopLoc at i on"/ > <r ecei ver andr oi d: name=" or g. si pdr oi d. si pua. ui . Cal l er "> <i nt ent - f i l t er andr oi d: pr i or i t y=" - 1">
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. NEW_OUTGOI NG_CALL" / > </ i nt ent - f i l t er >
</ r ecei v er >
<r ec ei ver andr oi d: name=" or g. si pdr oi d. s i pua. ui . Rec ei ver " andr oi d: enabl ed=" t r ue"> <i nt ent - f i l t er >
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. BOOT_COMPLETED" / >
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. EXTERNAL_APPLI CATI ONS_AVAI LABLE" / > <act i on andr oi d: name=" andr oi d. i nt ent . act i on. EXTERNAL_APPLI CATI ONS_UNAVAI LABLE" / > </ i nt ent - f i l t er >
<i nt ent - f i l t er >
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. PACKAGE_REPLACED" / > <dat a andr oi d: scheme=" package" / >
<dat a andr oi d: pat h=" or g. si pdr oi d. si pua" / > </ i nt ent - f i l t er >
</ r ecei v er >
<ser vi ce andr oi d: name=" or g. si pdr oi d. si pua. ui . Regi st er Ser v i ce" / > </ appl i c at i on>
<uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. I NTERNET"></ uses- per mi ssi on>
<uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. MODI FY_AUDI O_SETTI NGS"></ uses- per mi s si on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. RECORD_AUDI O"></ uses- per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. PROCESS_OUTGOI NG_CALLS"></ uses - per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. WRI TE_SETTI NGS"></ uses- per mi ss i on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. READ_PHONE_STATE"></ uses- per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. ACCESS_WI FI _STATE"></ uses- per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. RECEI VE_BOOT_COMPLETED"></ uses - per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. READ_CONTACTS"></ us es- per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. WRI TE_CONTACTS"></ uses- per mi ss i on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. CALL_PHONE"></ uses- per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. WAKE_LOCK"></ uses- per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. DI SABLE_KEYGUARD"></ uses- per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. CAMERA"></ uses- per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. VI BRATE" ></ uses- per mi ssi on>
<uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. ACCESS_FI NE_LOCATI ON" ></ uses- per mi s si on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. CHANGE_WI FI _STATE" ></ uses- per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. WRI TE_EXTERNAL_STORAGE" ></ uses- per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. BLUETOOTH" ></ uses- per mi ssi on>
<uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. GET_ACCOUNTS" ></ us es- per mi ssi on> <uses- per mi s si on andr oi d: name=" andr oi d. per mi ss i on. BROADCAST_STI CKY" ></ uses- per mi ssi on> </ mani f est >
Folder src
/Sipdroid/src/org/sipdroid/codecs
G711. j ava
package
or g. si pdr oi d. codecs;
/ * *
* G. 711 codec. Thi s cl ass pr ovi des met hods f or u- l aw, A- l aw and l i near PCM * conver si ons.
* /
publ i c cl ass G711 { / *
* Copyr i ght 1992 by Jut t a Degener and Car st en Bor mann, Techni s che * Uni ver si t aet Ber l i n. See t he accompanyi ng f i l e " COPYRI GHT" f or * det ai l s. THERE I S ABSOLUTELY NO WARRANTY FOR THI S SOFTWARE. * /
st at i c f i nal shor t[ ] a2s = newshor t[ 256] ;
st at i c f i nal i nt[ ] _a2s = {
11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, 344, 328, 376, 360, 280, 264, 312, 296, 472, 456, 504, 488, 408, 392, 440, 424, 88, 72, 120, 104, 24, 8, 56, 40, 216, 200, 248, 232, 152, 136, 184, 168, 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, 688, 656, 752, 720, 560, 528, 624, 592, 944, 912, 1008, 976, 816, 784, 880, 848 } ;
st at i c f i nal byt e[ ] s2a = newbyt e[ 65536] ;
st at i c f i nal i nt[ ] _s2a = {
33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 106, 106, 106, 106, 107, 107, 107, 107, 104, 104, 104, 104, 105, 105, 105, 105, 110, 110, 110, 110, 111, 111, 111, 111, 108, 108, 108, 108, 109, 109, 109, 109, 98, 98, 98, 98, 99, 99, 99, 99, 96, 96, 96, 96, 97, 97, 97, 97, 102, 102, 102, 102, 103, 103, 103, 103, 100, 100, 100, 100, 101, 101, 101, 101, 122, 122, 123, 123, 120, 120, 121, 121, 126, 126, 127, 127, 124, 124, 125, 125, 114, 114, 115, 115, 112, 112, 113, 113, 118, 118, 119, 119, 116, 116, 117, 117, 74, 75, 72, 73, 78, 79, 76, 77, 66, 67, 64, 65, 70, 71, 68, 69, 90, 91, 88, 89, 94, 95, 92, 93, 82, 83, 80, 81, 86, 87, 84, 85 } ;
/ / change G711 ul aw st ar t
st at i c f i nal i nt _u2a[ ] = { / * u- t o A- l aw conver si ons * /
1, 1, 2, 2, 3,
3, 4, 4,
5, 5, 6, 6, 7,
7, 8, 8,
9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
55, 56, 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128} ;
st at i c f i nal i nt _a2u[ ] = { / * A- t o u- l aw conver si ons * /
1, 3, 5, 7, 9,
11, 13, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 48, 49, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127} ; / / change end
publ i c st at i cvoi d i ni t ( ) { }
st at i c {
i nt i ;
f or ( i = 0; i < 256; i ++)
a2s[ i ] = (shor t)_a2s[ i ] ;
f or ( i = 0; i < 65536; i ++)
s2a[ i ] = (by t e)_s2a[ i >> 4] ; }
publ i c st at i cvoi d al aw2l i near (byt e al aw[ ] ,shor t l i n[ ] ,i nt f r ames) {
i nt i ;
f or ( i = 0; i < f r ames; i ++)
l i n[ i ] = a2s[ al aw[ i +12] & 0xf f ] ; }
publ i c st at i cvoi d al aw2l i near (byt e al aw[ ] ,shor t l i n[ ] ,i nt f r ames,i nt mu) {
i nt i ;
f or ( i = 0; i < f r ames; i ++)
l i n[ i ] = a2s[ al aw[ i / mu+12] & 0xf f ] ; }
publ i c st at i cvoi d l i near 2al aw(shor t l i n[ ] ,i nt of f set ,byt e al aw[ ] ,i nt f r ames) {
i nt i ;
f or ( i = 0; i < f r ames; i ++)
al aw[ i +12] = s2a[ l i n[ i +of f set ] & 0xf f f f ] ; }
/ / change g711 ul aw st ar t pr ot ect edst at i ci nt al aw2ul aw(i nt aval ) { aval &=0xf f ;
r et ur n ( ( aval & 0x80) ! =0) ? ( 0xFF^_a2u[ aval ^ 0xD5] ) : ( 0x7F^_a2u[ aval ^0x55] ) ; }
pr ot ect edst at i ci nt ul aw2al aw(i nt uval ) { uval &=0xf f ;
r et ur n ( ( uval &0x80) ! =0) ? ( 0xD5^ (_u2a[ 0xFF^ uval ] - 1) ) : ( 0x55^ (_u2a[ 0x7F^ uval ] - 1) ) ; }
publ i c st at i cvoi d ul aw2l i near (byt e ul aw[ ] ,shor t l i n[ ] ,i nt f r ames) {
i nt i ;
f or ( i = 0; i < f r ames; i ++)
l i n[ i ] = a2s[ul aw2al aw( ul aw[ i +12] & 0xf f ) ] ; }
publ i c st at i cvoi d l i near 2ul aw(shor t l i n[ ] ,i nt of f set ,byt e ul aw[ ] ,i nt f r ames) {
i nt i ;
f or ( i = 0; i < f r ames; i ++)
ul aw[ i +12] = (byt e)al aw2ul aw(s2a[ l i n[ i +of f set ] & 0xf f f f ] ) ; }
/ / change end }
alaw.java
package
or g. si pdr oi d. codecs;
CODEC_NAME = " PCMA" ;
CODEC_USER_NAME = " PCMA" ;
CODEC_DESCRI PTI ON = " 64kbi t " ;
CODEC_NUMBER = 8;
CODEC_DEFAULT_SETTI NG = " wl anor 3g" ;
l oad( ) ;
}
publ i c voi d
i ni t ( ) {
G711.
i ni t
( ) ;
}
publ i c i nt
decode(
byt eenc[ ] ,
shor tl i n[ ] ,
i ntf r ames) {
G711.
al aw2l i near
( enc, l i n, f r ames) ;
r et ur n
f r ames;
}
publ i c i nt
encode(
shor tl i n[ ] ,
i ntof f set ,
byt eenc[ ] ,
i ntf r ames) {
G711.
l i near 2al aw
( l i n, of f set , enc, f r ames) ;
r et ur n
f r ames;
}
publ i c voi d
cl ose( ) {
}
}
Ulaw.java
package or g. si pdr oi d. codecs;
cl ass ul aw e xt ends CodecBase i mpl e ment s Codec { ul aw( ) {
CODEC_NAME = " PCMU" ; CODEC_USER_NAME = " PCMU" ; CODEC_DESCRI PTI ON = " 64kbi t " ; CODEC_NUMBER = 0;
CODEC_DEFAULT_SETTI NG = " wl anor 3g" ; l oad( ) ;
}
publ i c voi d i ni t ( ) { G711.i ni t( ) ; }
publ i c i nt decode(byt e enc[ ] , shor t l i n[ ] , i nt f r ames) { G711.ul aw2l i near( enc, l i n, f r ames) ;
r et ur n f r ames; }
publ i c i nt encode(shor t l i n[ ] , i nt of f set , byt e enc[ ] , i nt f r ames) { G711.l i near 2ul aw( l i n, of f set , enc, f r ames) ;
r et ur n f r ames; }
publ i c voi d cl ose( ) { }
}
Codec.java
package or g. si pdr oi d. codecs;i mpor t andr oi d. pr ef er ence. Li st Pr ef er ence; / * *
* Repr esent s t he basi c i nt er f ace t o t he Codec cl asses Al l codecs need * t o i mpl ement basi c encode and decode capabi l i t y Codecs whi ch * i nher i t f r om { @l i nk CodecBase} onl y need t o i mpl ement encode, * dec ode and i ni t
* /
publ i c i nt er f ace Codec { / * *
* Dec ode a l i near pcm audi o st r eam *
* @par am encoded The encoded audi o st r eam *
* @par am l i n The l i near pcm audi o f r ame buf f er i n whi ch t o pl ace t he decoded st r eam *
* @r et ur ns The si ze of t he decoded f r ame * /
i nt decode( byt e encoded[ ] , shor t l i n[ ] , i nt si ze) ; / * *
* Enc ode a l i near pcm audi o st r eam *
* @par am l i n The l i near st r eam t o encode *
* @par am of f set The of f set i nt o t he l i near st r eam t o begi n *
* @par am encoded The buf f er t o pl ace t he encoded st r eam *
* @par am si ze t he si ze of t he l i near pcm st r eam ( i n wor ds) *
* @r et ur ns t he l engt h ( i n byt es) of t he encoded st r eam * /
i nt encode( s hor t l i n[ ] , i nt of f set , byt e al aw[ ] , i nt f r ames) ; / * *
* The sampl i ng r at e f or t hi s par t i cul ar codec * /
i nt samp_r at e( ) ; / * *
* The audi o f r ame si ze f or t hi s par t i cul ar codec * /
i nt f r ame_si ze( ) ; / * *
* Opt i onal l y used t o i ni t i al l i ze t he codec bef or e any * enc odi ng or decodi ng
* / voi d i ni t ( ) ; voi d updat e( ) ; / * *
* Opt i onal l y used t o f r ee any r es our ces al l oc at ed i n i ni t * af t er encodi ng or decodi ng i s c ompl et e
* / voi d c l ose( ) ; / * *
* ( i mpl ement ed by { @l i nk CodecBas e} * <p>
* checks t o see i f t he user has enabl ed t he c odec. *
* @r et ur ns t r ue i f t he codec can be used * /
bool ean i sEnabl ed( ) ;
/ * *
* ( i mpl ement ed by { @l i nk CodecBas e} * <p>
* Checks t o see i f t he bi nar y l i br ar y associ at ed wi t h t he * codec ( i f any) l oaded OK.
*
* @r et ur ns t r ue i f t he codec l oaded pr oper l y * /
bool ean i sLoaded( ) ; bool ean i sFai l ed( ) ; voi d f ai l ( ) ; bool ean i sVal i d( ) ; / * *
* ( i mpl ement ed by { @l i nk CodecBas e} *
* @r et ur ns The user f r i endl y st r i ng f or t he c odec ( shoul d * i nc l ude bot h t he name and t he bandwi dt h
* /
St r i ng get Ti t l e( ) ;
/ * *
* ( i mpl ement ed by { @l i nk CodecBas e} *
* @r et ur ns The RTP ass i gned name st r i ng f or t he codec * /
St r i ng name( ) ; St r i ng key( ) ; St r i ng get Val ue( ) ; / * *
* ( i mpl ement ed by { @l i nk CodecBas e} *
* @r et ur ns The commonl y used name f or t he codec. * /
St r i ng user Name( ) ; / * *
* ( i mpl ement ed by { @l i nk CodecBas e} *
* @r et ur ns The RTP ass i gned number f or t he codec * /
/ * *
* ( i mpl ement ed by { @l i nk CodecBas e} *
* @par am l The l i st pr ef er ence cont r ol l i ng t hi s Codec *
* Used t o add l i st ener s f or pr ef er ence changes and updat e * t he codec par amet er s accor di ngl y.
* /
voi d s et Li st Pr ef er ence( Li st Pr ef er ence l ) ; }
Codecs.java
package or g. si pdr oi d. codecs; i mpor t j ava. ut i l . HashMap; i mpor t j ava. ut i l . Vect or ; i mpor t or g. s i pdr oi d. si pua. R; i mpor t or g. s i pdr oi d. si pua. ui . Recei ver ; i mpor t or g. s i pdr oi d. si pua. ui . Set t i ngs; i mpor t or g. z ool u. sdp. Medi aFi el d; i mpor t or g. z ool u. sdp. Sessi onDescr i pt or ; i mpor t or g. z ool u. sdp. At t r i but eFi el d; i mpor t andr oi d. cont ent . Cont ext ; i mpor t andr oi d. cont ent . r es. Resour c es; i mpor t andr oi d. cont ent . Shar edPr ef er ences; i mpor t andr oi d. os. Bundl e;i mpor t andr oi d. pr ef er ence. Pr ef er ence; i mpor t andr oi d. pr ef er ence. Pr ef er enceAct i vi t y; i mpor t andr oi d. pr ef er ence. Li st Pr ef er ence; i mpor t andr oi d. pr ef er ence. Pr ef er enceManager ; i mpor t andr oi d. pr ef er ence. Pr ef er enceScr een; i mpor t andr oi d. vi ew. Cont ext Menu;
i mpor t andr oi d. vi ew. Cont ext Menu. Cont ext MenuI nf o; i mpor t andr oi d. vi ew. Menu;
i mpor t andr oi d. vi ew. MenuI t em; i mpor t andr oi d. vi ew. Vi ew;
i mpor t andr oi d. wi dget . Adapt er Vi ew. Adapt er Cont ext MenuI nf o; publ i c cl ass Codecs {
pr i vat e st at i c f i nal Vect or <Codec> codecs = new Vect or <Codec>( ) { {
/ / add( new G722( ) ) ;
/ / add( new SI LK24( ) ) ; save s pace ( unt i l a common l i br ar y f or al l bi t r at es get s avai l abl e?)
/ / add( new SI LK16( ) ) ; / / add( new SI LK8( ) ) ;
add( new al aw( ) ) ; add( new ul aw( ) ) ; / / add( new Speex( ) ) ;
/ / add( new GSM( ) ) ;
/ / add( new BV16( ) ) ;
} } ;
pr i vat e st at i c f i nal HashMap<I nt eger , Codec> c odecsNumber s; pr i vat e st at i c f i nal HashMap<St r i ng, Codec> codecsNames;
st at i c {
f i nal i nt si ze = codecs . si ze( ) ;
codecs Number s = new Has hMap<I nt eger , Codec>( si ze) ; codecs Names = new HashMap<St r i ng, Codec>( si ze) ; f or ( Codec c : codecs) {
codecs Names. put ( c. name( ) , c) ; codecs Number s. put ( c. number ( ) , c) ; }
Shar edPr ef er ences sp = Pr ef er enceManager . get Def aul t Shar edPr ef er ences( Recei ver . mCont ext ) ; St r i ng pr ef s = sp. get St r i ng( Set t i ngs. PREF_CODECS, Set t i ngs. DEFAULT_CODECS) ;
i f ( pr ef s == nul l ) { St r i ng v = " " ;
Shar edPr ef er ences. Edi t or e = sp. edi t ( ) ; f or ( Codec c : codecs)
v = v + c. number ( ) + " " ; e. put St r i ng( Set t i ngs. PREF_CODECS, v) ; e. commi t ( ) ;
} el se {
St r i ng[ ] val s = pr ef s. s pl i t ( " " ) ; f or ( St r i ng v: val s) {
t r y {
i nt i = I nt eger . par seI nt ( v) ; Codec c = codecsNumber s . get ( i ) ; / * mov es t he codec t o t he end * of t he l i st so we end up * wi t h t he new codecs ( i f * any ) at t he t op and t he * r emai ni ng ones or der ed * acc or di ng t o t he user * / i f ( c ! = nul l ) {
codecs . r emov e( c) ; codecs . add( c ) ; }
} cat c h ( Exc ept i on e) {
/ / i ndexnot f ound }
} }
}
publ i c st at i c Codec get ( i nt key) { r et ur n codec sNumber s. get ( key) ; }
publ i c st at i c Codec get Name( St r i ng name) { r et ur n codec sNames. get ( name) ; }
publ i c st at i c voi d chec k( ) {
HashMap<St r i ng, St r i ng> ol d = new HashMap<St r i ng, St r i ng>( codec s. si ze( ) ) ; f or ( Codec c : codecs) {
c. updat e( ) ;
ol d. put ( c. name( ) , c. get Val ue( ) ) ; i f ( ! c . i sLoaded( ) ) {
Shar edPr ef er ences sp = Pr ef er enceManager . get Def aul t Shar edPr ef er ences( Recei ver . mCont ext ) ;
Shar edPr ef er ences. Edi t or e = sp. edi t ( ) ; e. put St r i ng( c. key( ) , " never " ) ; e. commi t ( ) ;
} }
f or ( Codec c : codecs)
i f ( ! ol d. get ( c. name( ) ) . equal s( " nev er " ) ) { c. i ni t ( ) ;
i f ( c. i sLoaded( ) ) {
Shar edPr ef er ences sp = Pr ef er enceManager . get Def aul t Shar edPr ef er ences( Recei ver . mCont ext ) ;
Shar edPr ef er ences. Edi t or e = sp. edi t ( ) ; e. put St r i ng( c. key( ) , ol d. get ( c. name( ) ) ) ; e. commi t ( ) ;
c. i ni t ( ) ; } el se
c. f ai l ( ) ; }
}
pr i vat e st at i c voi d addPr ef er ences( Pr ef er enceScr een ps) { Cont ex t cx = ps. get Cont ext ( ) ;
Resour ces r = cx. get Res our ces( ) ; ps. set Or der i ngAsAdded( t r ue) ;
f or ( Codec c : codecs) {
Li st Pr ef er ence l = new Li st Pr ef er ence( cx) ;
l . set Ent r i es ( r . get St r i ngAr r ay( R. ar r ay. compr ess i on_di spl ay _val ues) ) ; l . set Ent r yVal ues( r . get St r i ngAr r ay( R. ar r ay. compr essi on_val ues) ) ; l . set Key( c. k ey( ) ) ;
l . set Per si st ent ( t r ue) ; l . set Enabl ed( ! c. i sFai l ed( ) ) ; c. set Li st Pr ef er ence( l ) ; i f ( c. number ( ) == 9)
i f ( ps . get Shar edPr ef er ences( ) . get St r i ng( Set t i ngs. PREF_SERVER, Set t i ngs. DEFAULT_SERVER) . equal s( Set t i ngs. DEFAULT_SERVER) )
l . set Summar y ( l . get Ent r y ( ) +" ( " +r . get St r i ng( R. st r i ng. set t i ngs_i mpr ove2) +" ) " ) ;
el se
l . set Summar y ( l . get Ent r y ( ) +" ( " +r . get St r i ng( R. st r i ng. set t i ngs_hdvoi ce) +" ) " ) ;
el se
l . set Summar y ( l . get Ent r y ( ) ) ; l . set Ti t l e( c . get Ti t l e( ) ) ;
ps. addPr ef er ence( l ) ; }
}
publ i c st at i c i nt [ ] get Codecs( ) {
Vect or <I nt eger > v = new Vect or <I nt eger >( codecs . si ze( ) ) ; f or ( Codec c : codecs) {
c. updat e( ) ; i f ( ! c . i sVal i d( ) )
cont i nue; v. add( c. number ( ) ) ; }
i nt i [ ] = new i nt [ v. si z e( ) ] ; f or ( i nt j = 0; j < i . l engt h; j ++)
i [ j ] = v. el ement At ( j ) ; r et ur n i ;
}
Map( i nt n, Codec c, Vec t or <I nt eger > ns, Vect or <Codec> cs) { number = n;
codec = c; number s = ns ; codecs = cs; }
publ i c bool ean change( i nt n) { i nt i = number s. i ndexOf ( n) ;
i f ( i >= 0 && codecs. el ement At ( i ) ! = nul l ) { codec. cl ose( ) ;
number = n;
codec = codecs. el ement At ( i ) ; r et ur n t r ue;
}
r et ur n f al se; }
publ i c St r i ng t oSt r i ng( ) {
r et ur n " Codecs. Map { " + number + " : " + codec + " } " ; }
} ;
publ i c st at i c Map get Codec( Sessi onDescr i pt or of f er s) {
Medi aFi el d m = of f er s. get Medi aDesc r i pt or ( " audi o" ) . get Medi a( ) ; i f ( m==nul l )
r et ur n nul l ; St r i ng pr ot o = m. get Tr anspor t ( ) ;
/ / see ht t p: / / t ool s. i et f . or g/ ht ml / r f c4566#page- 22, par agr aph 5. 14, <f mt > descr i pt i on i f ( pr ot o. equal s( " RTP/ AVP" ) | | pr ot o. equal s( " RTP/ SAVP" ) ) {
Vect or <St r i ng> f or mat s = m. get For mat Li st ( ) ;
Vect or <St r i ng> names = new Vect or <St r i ng>( f or mat s. si ze( ) ) ; Vect or <I nt eger > number s = new Vect or <I nt eger >( f or mat s. si z e( ) ) ; Vect or <Codec > codecmap = new Vect or <Codec>( f or mat s. si ze( ) ) ; / / add al l av ai l f or mat s wi t h empt y names
f or ( St r i ng f mt : f or mat s) { t r y {
i nt number = I nt eger . par seI nt ( f mt ) ; number s. add( number ) ;
names. add( " " ) ; codecmap. add( nul l ) ; } cat c h ( Number For mat Ex cept i on e) {
/ / cont i nue . . . r emot e sent bogus r t p set t i ng }
} ;
/ / i f we have at t r s f or f or mat - > s et name Vect or <At t r i but eFi el d> at t r s =
of f er s . get Medi aDescr i pt or ( " audi o" ) . get At t r i but es( " r t pmap" ) ; f or ( At t r i but eFi el d a : at t r s) {
St r i ng s = a. get Val ue( ) ; / / ski p over " r t pmap: "
s = s. subst r i ng( 7, s. i ndexOf ( " / " ) ) ; i nt i = s. i ndexOf ( " " ) ;
t r y {
St r i ng name = s. subst r i ng( i + 1) ;
i nt number = I nt eger . par seI nt ( s. subst r i ng( 0, i ) ) ; i nt i ndex = number s. i ndexOf ( number ) ;
i f ( i ndex >=0)
names. set ( i ndex, name. t oLower Case( ) ) ; } cat c h ( Number For mat Ex cept i on e) {
/ / cont i nue . . . r emot e sent bogus r t p set t i ng }
}
Codec codec = nul l ;
i nt i ndex = f or mat s. si z e( ) + 1; f or ( Codec c : codecs) {
c. updat e( ) ; i f ( ! c . i sVal i d( ) )
cont i nue;
/ / sear ch cur r ent codec i n of f er s by name i nt i = names. i ndexOf ( c . user Name( ) . t oLower Case( ) ) ; i f ( i >= 0) {
codecmap. set ( i , c) ;
i f ( ( codec==nul l ) | | ( i < i ndex) ) { codec = c;
i ndex = i ; cont i nue; }
}
/ / sear ch cur r ent codec i n of f er s by number i = number s. i ndexOf ( c. number ( ) ) ; i f ( i >= 0) {
i f ( names. el ement At ( i ) . equal s( " " ) ) { codecmap. set ( i , c) ;
codec = c; i ndex = i ; cont i nue; }
} }
}
i f ( codec! =nul l )
r et ur n new Map( number s. el ement At ( i ndex) , codec , number s, codecmap) ; el se
/ / no codec f ound . . . we can' t t al k r et ur n nul l ;
} el se
/ * f or mat s of ot her pr ot ocol s not s uppor t ed yet * / r et ur n nul l ;
}
publ i c st at i c cl ass CodecSet t i ngs ext ends Pr ef er enceAct i v i t y { pr i vat e st at i c f i nal i nt MENU_UP = 0;
pr i vat e st at i c f i nal i nt MENU_DOWN = 1; @Over r i de
publ i c voi d onCr eat e( Bundl e savedI nst anceSt at e) { super . onCr eat e( savedI ns t anceSt at e) ;
addPr ef er enc esFr omResour ce( R. xml . c odec_set t i ngs) ;
/ / f or l ong- pr ess gest ur e on a pr of i l e pr ef er ence r egi st er For Cont ext Menu( get Li st Vi ew( ) ) ;
addPr ef er enc es( get Pr ef er enceScr een( ) ) ; }
@Over r i de
publ i c voi d onCr eat eCont ext Menu( Cont ext Menu menu, Vi ew v,
Cont ex t MenuI nf o menuI nf o) { super . onCr eat eCont ext Menu( menu, v, menuI nf o) ;
menu. s et Header Ti t l e( R. s t r i ng. codec s_move) ; menu. add( Menu. NONE, MENU_UP, 0,
R. st r i ng. c odecs_move_up) ; menu. add( Menu. NONE, MENU_DOWN, 0,
R. st r i ng. c odecs_move_down) ; }
@Over r i de
publ i c bool ean onCont ex t I t emSel ect ed( MenuI t em i t em) {
i nt posn = ( i nt ) ( ( Adapt er Cont ext MenuI nf o) i t em. get MenuI nf o( ) ) . posi t i on; Codec c = codecs. el ement At ( posn) ;
i f ( i t em. get I t emI d( ) == MENU_UP) { i f ( posn == 0)
r et ur n super . onCont ext I t emSel ect ed( i t em) ; Codec t mp = codecs. el ement At ( posn - 1) ;
codecs . set ( posn - 1, c) ; codecs . set ( posn, t mp) ; } el se i f ( i t em. get I t emI d( ) == MENU_DOWN) {
i f ( posn == codecs. si ze( ) - 1)
r et ur n super . onCont ext I t emSel ect ed( i t em) ; Codec t mp = codecs. el ement At ( posn + 1) ;
codecs . set ( posn + 1, c) ; codecs . set ( posn, t mp) ; }
Pr ef er enceSc r een ps = get Pr ef er enc eScr een( ) ; Shar edPr ef er ences sp =
Pr ef er enceManager . get Def aul t Shar edPr ef er ences( Recei ver . mCont ext ) ; St r i ng v = " " ;
Shar edPr ef er ences. Edi t or e = sp. edi t ( ) ; f or ( Codec d : codecs)
v = v + d. number ( ) + " " ; e. put St r i ng( Set t i ngs. PREF_CODECS, v) ; e. commi t ( ) ;
ps. r emoveAl l ( ) ; addPr ef er enc es( ps) ;
r et ur n super . onCont ext I t emSel ect ed( i t em) ; }
@Over r i de
publ i c bool ean onPr ef er enceTr eeCl i ck( Pr ef er enc eScr een ps, Pr ef er ence p) { Li st Pr ef er ence l = ( Li s t Pr ef er ence) p;
f or ( Codec c : codecs)
i f ( c. key( ) . equal s( l . get Key( ) ) ) { c. i ni t ( ) ;
i f ( ! c . i sLoaded( ) ) {
l . set Val ue( " never " ) ; c. f ai l ( ) ;
l . set Enabl ed( f al se) ; l . set Summar y ( l . get Ent r y ( ) ) ; i f ( l . get Di al og( ) ! = nul l )
l . get Di al og( ) . di smi ss( ) ; }
}
} @Over r i de
publ i c voi d onDest r oy( ) { super . onDest r oy( ) ;
unr egi st er For Cont ext Menu( get Li st Vi ew( ) ) ; }
} }
/
Sipdroid/src/org/sipdroid/media
JAudioLauncher.java
package or g. si pdr oi d. medi a; i mpor t or g. s i pdr oi d. codecs. Codecs; i mpor t or g. s i pdr oi d. net . Si pdr oi dSocket ; i mpor t or g. s i pdr oi d. si pua. ui . Recei ver ; i mpor t or g. s i pdr oi d. si pua. ui . Si pdr oi d; i mpor t or g. z ool u. si p. pr ovi der . Si pSt ack; i mpor t or g. z ool u. t ool s. Log;i mpor t or g. z ool u. t ool s. LogLevel ;
i mpor t andr oi d. pr ef er ence. Pr ef er enceManager ; / * * Audi o l auncher based on j avax. sound * / publ i c cl ass JAudi oLauncher i mpl ement s Medi aLauncher {
/ * * Event l ogger . * / Log l og=nul l ;
/ * * Sampl e r at e [ byt es] * / i nt sampl e_r at e=8000; / * * Sampl e si ze [ byt es] * / i nt sampl e_si ze=1; / * * Fr ame si ze [ byt es] * / i nt f r ame_si ze=160;
/ * * Fr ame r at e [ f r ames per second] * /
i nt f r ame_r at e=50; / / =sampl e_r at e/ ( f r ame_si ze/ sampl e_s i ze) ; bool ean s i gned=f al se;
bool ean bi g_endi an=f al se; / / St r i ng f i l ename=" audi o. wav" ; / * * Test t one * /
publ i c st at i c f i nal St r i ng TONE=" TONE" ; / * * Test t one f r equency [ Hz] * / publ i c st at i c i nt t one_f r eq=100;
/ * * Test t one ampl i t ur e ( f r om 0. 0 t o 1. 0) * / publ i c st at i c doubl e t one_amp=1. 0; / * * Runt i me medi a pr ocess * / Pr ocess medi a_pr oces s=nul l ;
i nt di r ; / / dupl ex= 0, r ecv- onl y= - 1, send- onl y= +1; Si pdr oi dSocket socket =nul l ;
Rt pSt r eamSender sender =nul l ; Rt pSt r eamRecei ver r ecei ver =nul l ;
/ / c hange DTMF
bool ean useDTMF = f al se; / / zer o means not use out band DTMF
/ * * Cost r uct s t he audi o l auncher * /
publ i c JAudi oLauncher ( Rt pSt r eamSender r t p_s ender , Rt pSt r eamRecei ver r t p_r ecei ver , Log l ogger ) { l og=l ogger ;
sender =r t p_sender ; r ecei v er =r t p_r ecei ver ; }
/ * * Cost r uct s t he audi o l auncher * /
publ i c JAudi oLauncher ( i nt l ocal _por t , St r i ng r emot e_addr , i nt r emot e_por t , i nt di r ect i on, St r i ng audi of i l e_i n, St r i ng audi of i l e_out , i nt sampl e_r at e, i nt sampl e_si z e, i nt f r ame_si ze, Log l ogger , Codecs. Map payl oad_t ype, i nt dt mf _pt ) { l og=l ogger ;
f r ame_r at e=sampl e_r at e/ f r ame_si ze; useDTMF = ( dt mf _pt ! = 0) ; t r y
{
Cal l Recor der cal l _r ecor der = nul l ; i f
( Pr ef er enceManager . get Def aul t Shar edPr ef er ences ( Recei ver . mCont ex t ) . get Bool ean( or g. si pdr oi d. si pua. ui . Set t i ngs. PREF_CALLREC ORD,
or g. si pdr oi d. si pua. ui . Set t i ngs. DEFAULT_CALLRECORD) )
cal l _r ecor der = new Cal l Recor der ( nul l , payl oad_t ype. codec . samp_r at e( ) ) ; / / Aut ogener at e f i l ename f r om dat e.
socket =new Si pdr oi dSoc ket ( l ocal _por t ) ; di r =di r ect i on;
/ / sender i f ( di r >=0)
sender =new
Rt pSt r eamSender ( t r ue, payl oad_t ype, f r ame_r at e, f r ame_si ze, s ocket , r emot e_addr , r emot e_por t , cal l _r ecor der ) ; sender . set SyncAdj ( 2) ;
sender . set DTMFpayl oadType( dt mf _pt ) ; }
/ / r ecei ver i f ( di r <=0)
{ pr i nt Log( " new audi o r ecei ver on " +l ocal _por t , LogLev el . MEDI UM) ; r ecei ver =new Rt pSt r eamRecei ver ( soc ket , payl oad_t ype, cal l _r ecor der ) ; }
}
cat ch ( Except i on e) { pr i nt Except i on( e, LogLevel . HI GH) ; } }
/ * * St ar t s medi a appl i cat i on * / publ i c bool ean st ar t Medi a( )
{ pr i nt Log( " st ar t i ng j ava audi o. . " , LogLevel . HI GH) ; i f ( sender ! =nul l )
{ pr i nt Log( " st ar t sendi ng" , LogLevel . LOW) ; sender . st ar t ( ) ;
}
i f ( r ecei ver ! =nul l )
{ pr i nt Log( " st ar t r ecei vi ng" , LogLevel . LOW) ; r ec ei ver . st ar t ( ) ;
}
r et ur n t r ue; }
/ * * St ops medi a appl i cat i on * / publ i c bool ean st opMedi a( )
{ pr i nt Log( " hal t i ng j ava audi o. . " , LogLevel . HI GH) ; i f ( sender ! =nul l )
{ sender . hal t ( ) ; sender =nul l ;
pr i nt Log( " sender hal t ed" , LogLevel . LOW) ; }
i f ( r ecei ver ! =nul l )
{ r ec ei ver . hal t ( ) ; r ecei ver =nul l ; pr i nt Log( " r ecei ver hal t ed" , LogLevel . LOW) ; }
i f ( socket ! = nul l ) sock et . cl ose( ) ; r et ur n t r ue; }
publ i c bool ean mut eMedi a( ) {
i f ( sender ! = nul l )
r et ur n sender . mut e( ) ; r et ur n f al se;
}
publ i c i nt speaker Medi a( i nt mode) {
i f ( r ecei ver ! = nul l )
r et ur n r ecei ver . speaker ( mode) ; r et ur n 0;
}
publ i c voi d bl uet oot hMedi a( ) {
i f ( r ecei ver ! = nul l )
r ec ei ver . bl uet oot h( ) ; }
/ / c hange DTMF
/ * * Send out band DTMF packet s * * / publ i c bool ean sendDTMF( char c) {
i f ( ! us eDTMF) r et ur n f al se; sender . s endDTMF( c) ; r et ur n t r ue; }
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Logs * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / * * Adds a new st r i ng t o t he def aul t Log * /
pr i vat e v oi d pr i nt Log( St r i ng st r ) { pr i nt Log( st r , LogLevel . HI GH) ; }
/ * * Adds a new st r i ng t o t he def aul t Log * / pr i vat e v oi d pr i nt Log( St r i ng st r , i nt l evel ) {
i f ( Si pdr oi d. r el ease) r et ur n;
i f ( l og! =nul l ) l og. pr i nt l n( " Audi oLauncher : " +st r , l evel +Si pSt ack. LOG_LEVEL_UA) ; i f ( l evel <=LogLev el . HI GH) Sys t em. out . pr i nt l n( " Audi oLauncher : " +st r ) ;
}
/ * * Adds t he Except i on message t o t he def aul t Log * / voi d pr i nt Except i on( Except i on e, i nt l evel ) {
i f ( Si pdr oi d. r el ease) r et ur n;
i f ( l evel <=LogLev el . HI GH) e. pr i nt St ackTr ace( ) ; }
MediaLauncher.java
package or g. s