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