# audio_app **Repository Path**: droshua/audio_app ## Basic Information - **Project Name**: audio_app - **Description**: 点对点加速的语音通话 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2024-12-04 - **Last Updated**: 2025-03-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Server时序图 ```mermaid sequenceDiagram participant u1 as user1 participant s as server participant u2 as user2 activate u1 u1 ->> + s : login : {userId:0xFFFFFFFF, user1IPList}, timeout 3s s ->> +s : check same IP port s -->> - u1 : login success : {userId:0x**, userToken, allUserIPList} deactivate u1 loop every 30 mins activate u1 u1 ->> u1 : get user1 own IP List deactivate u1 alt user1IPListChanged u1 ->> + s : update userIpList : {user1IPList} s ->> s : process ip changed s ->> - u2 : user1IPList end end loop every 2s s ->> s : check user is alive end loop every 500ms u1 ->> + s : heartbeat : {user1Id, user1Token} s ->> - s : process heartbeat end activate u1 u1 ->> + s : call request : {{userId, userToken}, targetUserId, digHoleToken} u1 ->> u1 : recv server reply, timeout 1s s ->> s : set u2 unavailable, set u1 unavailable s -->> u1 : {isAvailable[, digHoleToken, sessionId]} deactivate u1 alt user2 available s ->> + u2 : {srcUserId, digHoleToken, sessionId} s ->> s : waiting u2 response, timeout 2s u2 -->> s : response, to tell server that u2 is notified s ->> u1 : if u2 is notified alt u2 is notified loop each u2 ip u1 ->> u2 : dig hole to user2ip[i] {user1Id, digHoleToken} end end end alt user2 refused u2 -->> + s : refuse call : {user2Id, user2Token, refuse, sessionId} s ->> s : set u2 available, set u1 available s ->> - u1 : response call : {user2Id, refuse, sessionId}, timeout 1s u1 -->> s : ok : {user1Id, user1Token} else user accepted u2 ->> + u1 : dig hole : {ip, port, digHoleToken} u2 -->> + s : {userId, userToken, accept, sessionId}, timeout 1s, waiting for u1 s ->> - u1 : notify user1 : {user2Id, accept, sessionId} u1 -->> u2 : ok : {user1Id, sessionId} loop till stop session par 并行 u1 ->> + u2 : sound bytes stream u2 ->> - u2 : play sound and u2 ->> + u1 : sound bytes stream u1 ->> - u1 : play sound end end loop session heartbeat u1 ->> s : session heartbeat{user1Id, user1token, sessionId} every 300ms s ->> s: set u1 alive {user1Id, sessionId} u2 ->> s : session heartbeat{user2Id, user2token, sessionId} every 300ms s ->> s: set u2 alive {user2Id, sessionId} end end u1 ->> + s : leave session : {user1Id, user1Token, sessionId}, timeout 1s s -->> - u1 : confirm leave : {sessionId} s ->> + u2 : leave session : {sessionId, user1Id}, timeout 1s u2 -->> - s : confirm leave : {sessionId, user2Id} s ->> + s : delete session : {sessionId} ```