@@ -43,7 +43,8 @@ class SpatialAudioMain: BaseViewController {
43
43
}
44
44
45
45
func setupUI( ) {
46
- infoLabel. text = " 请插入耳机体验空间音效效果 " . localized
46
+ infoLabel. text = " Please insert headphones to experience the spatial audio effect " . localized
47
+ startButton. setTitle ( " Start " . localized, for: . normal)
47
48
48
49
let panGesture = UIPanGestureRecognizer ( target: self , action: #selector( panGestureChanged) )
49
50
self . soundSourceView. addGestureRecognizer ( panGesture)
@@ -66,10 +67,12 @@ class SpatialAudioMain: BaseViewController {
66
67
self . peopleView. isHidden = false
67
68
self . soundSourceView. isHidden = false
68
69
} else {
69
- self . infoLabel. text = " 你会听到一段音乐, \( self . downCount - timeout) 秒后这段音乐会通过空间音效的方式播放 "
70
+ let text = " You will hear a piece of music, and after 10 seconds this piece of music will be played through spatial audio effects " . localized
71
+ self . infoLabel. text = " \( text) ( \( self . downCount - timeout) ) "
70
72
}
71
73
} else {
72
- self . infoLabel. text = " 现在您可以移动喇叭图标到不同的位置, 体验空间音效效果( \( self . downCount) ) " . localized
74
+ let text = " Now you can move the speaker icon to experience the spatial audio effect " . localized
75
+ self . infoLabel. text = " \( text) ( \( self . downCount) ) "
73
76
if self . downCount == 0 {
74
77
self . agoraKit. stopEchoTest ( )
75
78
self . agoraKit. enableSpatialAudio ( false )
@@ -78,55 +81,54 @@ class SpatialAudioMain: BaseViewController {
78
81
self . peopleView. isHidden = true
79
82
self . soundSourceView. isHidden = true
80
83
self . startButton. isHidden = false
81
- self . infoLabel. text = " 请插入耳机体验空间音效效果 " . localized
84
+ self . infoLabel. text = " Please insert headphones to experience the spatial audio effect " . localized
82
85
}
83
86
}
84
87
}
85
88
}
86
89
87
90
@objc func panGestureChanged( gesture: UIPanGestureRecognizer ) {
88
- let circleCenter = self . peopleView. center
89
91
let move = gesture. translation ( in: self . view)
90
- var newCenter = gesture. view!. center
91
- newCenter = CGPoint ( x: newCenter. x + move. x, y: newCenter. y + move. y)
92
-
93
- let deltaX = newCenter. x - circleCenter. x
94
- let deltaY = circleCenter. y - newCenter. y
95
- if deltaX == 0 { return }
96
-
97
- // In spatial audio, angle is range [0, 360], it is angle 0 when at Y direction.
98
- let tanValue = abs ( deltaY) / abs( deltaX)
99
- let tanAngle = atan ( tanValue) * 180.0 / Double. pi
100
- var spatialAngle = 0.0
101
- if deltaX > 0 && deltaY > 0 { // scope I
102
- spatialAngle = 270.0 + tanAngle
103
- } else if deltaX < 0 && deltaY > 0 { // scope II
104
- spatialAngle = 90.0 - tanAngle
105
- } else if deltaX < 0 && deltaY < 0 { // scope III
106
- spatialAngle = 90.0 + tanAngle
107
- } else if deltaX > 0 && deltaY < 0 { // scope IV
108
- spatialAngle = 270.0 - tanAngle
92
+ var objectCenter = gesture. view!. center
93
+ objectCenter = CGPoint ( x: objectCenter. x + move. x, y: objectCenter. y + move. y)
94
+ soundSourceView. center = objectCenter
95
+ gesture. setTranslation ( . zero, in: self . view)
96
+
97
+ if gesture. state == . ended {
98
+ updatePosition ( objectCenter: objectCenter)
109
99
}
100
+ }
101
+
102
+ func updatePosition( objectCenter: CGPoint ) {
103
+ let circleCenter = self . peopleView. center
104
+ let deltaX = objectCenter. x - circleCenter. x
105
+ let deltaY = circleCenter. y - objectCenter. y
106
+ let R = sqrt ( deltaX * deltaX + deltaY * deltaY)
110
107
111
- if gesture. state == . ended {
112
- let L = sqrt ( deltaX * deltaX + deltaY * deltaY)
113
- let maxL = UIScreen . main. bounds. height / 2.0
114
- let maxSpatailDistance = 30.0
115
- let spatialDistance = L * maxSpatailDistance / maxL
116
- currentAngle = spatialAngle
117
- currentDistance = spatialDistance
118
-
119
- self . updateRemoteUserSpatialAudioPositon ( )
108
+ // In spatial audio, angle is range [0, 360], it is angle 0 when at Y direction with anti-clockwise
109
+ let TwoPI = Double . pi * 2.0
110
+ let cosAngle = acos ( deltaX / R)
111
+ let mathAngle = deltaY > 0 ? cosAngle : ( TwoPI - cosAngle)
112
+ var spatialAngle = mathAngle - TwoPI / 4.0
113
+ if spatialAngle < 0 {
114
+ spatialAngle = TwoPI + spatialAngle
120
115
}
121
116
122
- self . soundSourceView. center = newCenter
123
- gesture. setTranslation ( . zero, in: self . view)
117
+ currentAngle = spatialAngle
118
+ currentDistance = R
119
+ self . updateRemoteUserSpatialAudioPositon ( )
120
+ print ( " \( mathAngle) , \( spatialAngle) , \( deltaX) , \( deltaY) " )
124
121
}
125
122
126
123
func updateRemoteUserSpatialAudioPositon( ) {
124
+ let maxR = UIScreen . main. bounds. height / 2.0
125
+ let maxSpatailDistance = 30.0
126
+ let spatialDistance = currentDistance * maxSpatailDistance / maxR
127
+ let spatialAngle = currentAngle * 180.0 / Double. pi
128
+
127
129
let spatialParams = AgoraSpatialAudioParams ( )
128
- spatialParams. speaker_azimuth = . of( Double ( currentAngle ) )
129
- spatialParams. speaker_distance = . of( currentDistance )
130
+ spatialParams. speaker_azimuth = . of( spatialAngle )
131
+ spatialParams. speaker_distance = . of( spatialDistance )
130
132
spatialParams. speaker_elevation = . of( 0 )
131
133
spatialParams. enable_blur = . of( false )
132
134
spatialParams. enable_air_absorb = . of( true )
0 commit comments