Get transmission working
This commit is contained in:
parent
91cd6182d8
commit
4e44a4ed75
@ -375,14 +375,6 @@ void ClientApplication::update() {
|
|||||||
else if (m_state > MainAppState::Title)
|
else if (m_state > MainAppState::Title)
|
||||||
updateRunning();
|
updateRunning();
|
||||||
|
|
||||||
{ // testing
|
|
||||||
m_voice->setLocalSpeaker(0);
|
|
||||||
m_voice->setInput(m_input->bindHeld("opensb", "pushToTalk"));
|
|
||||||
DataStreamBuffer data;
|
|
||||||
if (m_voice->send(data, 5000))
|
|
||||||
m_voice->receive(m_voice->speaker(0), std::string_view(data.ptr(), data.size()));
|
|
||||||
}
|
|
||||||
|
|
||||||
m_guiContext->cleanup();
|
m_guiContext->cleanup();
|
||||||
m_edgeKeyEvents.clear();
|
m_edgeKeyEvents.clear();
|
||||||
m_input->reset();
|
m_input->reset();
|
||||||
@ -860,13 +852,41 @@ void ClientApplication::updateRunning() {
|
|||||||
if (checkDisconnection())
|
if (checkDisconnection())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
m_voice->setInput(m_input->bindHeld("opensb", "pushToTalk"));
|
||||||
|
DataStreamBuffer voiceData;
|
||||||
|
voiceData.setByteOrder(ByteOrder::LittleEndian);
|
||||||
|
voiceData.writeBytes(VoiceBroadcastPrefix.utf8Bytes());
|
||||||
|
bool needstoSendVoice = m_voice->send(voiceData, 5000);
|
||||||
|
|
||||||
m_universeClient->update();
|
m_universeClient->update();
|
||||||
|
|
||||||
if (checkDisconnection())
|
if (checkDisconnection())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (auto worldClient = m_universeClient->worldClient())
|
if (auto worldClient = m_universeClient->worldClient()) {
|
||||||
|
auto& broadcastCallback = worldClient->broadcastCallback();
|
||||||
|
if (!broadcastCallback) {
|
||||||
|
broadcastCallback = [&](PlayerPtr player, StringView broadcast) -> bool {
|
||||||
|
auto& view = broadcast.utf8();
|
||||||
|
if (view.rfind(VoiceBroadcastPrefix.utf8(), 0) != NPos) {
|
||||||
|
auto entityId = player->entityId();
|
||||||
|
auto speaker = m_voice->speaker(connectionForEntity(entityId));
|
||||||
|
speaker->entityId = entityId;
|
||||||
|
speaker->name = player->name();
|
||||||
|
speaker->position = player->mouthPosition();
|
||||||
|
m_voice->receive(speaker, view.substr(VoiceBroadcastPrefix.utf8Size()));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (worldClient->inWorld()) {
|
||||||
|
if (needstoSendVoice)
|
||||||
|
worldClient->sendSecretBroadcast(StringView(voiceData.ptr(), voiceData.size()));
|
||||||
|
m_voice->setLocalSpeaker(worldClient->connection());
|
||||||
|
}
|
||||||
worldClient->setInteractiveHighlightMode(isActionTaken(InterfaceAction::ShowLabels));
|
worldClient->setInteractiveHighlightMode(isActionTaken(InterfaceAction::ShowLabels));
|
||||||
|
}
|
||||||
|
|
||||||
updateCamera();
|
updateCamera();
|
||||||
|
|
||||||
|
@ -241,6 +241,7 @@ void Voice::mix(int16_t* buffer, size_t frameCount, unsigned channels) {
|
|||||||
if (!audio->samples.empty()) {
|
if (!audio->samples.empty()) {
|
||||||
std::vector<int16_t> samples = move(audio->samples);
|
std::vector<int16_t> samples = move(audio->samples);
|
||||||
audioLock.unlock();
|
audioLock.unlock();
|
||||||
|
speaker->decibelLevel = getAudioLoudness(samples.data(), samples.size());
|
||||||
if (!speaker->muted) {
|
if (!speaker->muted) {
|
||||||
mix = true;
|
mix = true;
|
||||||
if (voiceBuffer.size() < samples.size())
|
if (voiceBuffer.size() < samples.size())
|
||||||
@ -286,8 +287,8 @@ void Voice::update(PositionalAttenuationFunction positionalAttenuationFunction)
|
|||||||
for (auto& entry : m_speakers) {
|
for (auto& entry : m_speakers) {
|
||||||
if (SpeakerPtr& speaker = entry.second) {
|
if (SpeakerPtr& speaker = entry.second) {
|
||||||
speaker->channelVolumes = {
|
speaker->channelVolumes = {
|
||||||
positionalAttenuationFunction(0, speaker->position, 1.0f),
|
1.0f - positionalAttenuationFunction(0, speaker->position, 1.0f),
|
||||||
positionalAttenuationFunction(1, speaker->position, 1.0f)
|
1.0f - positionalAttenuationFunction(1, speaker->position, 1.0f)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -376,7 +377,6 @@ bool Voice::receive(SpeakerPtr speaker, std::string_view view) {
|
|||||||
decodedSamples *= channels;
|
decodedSamples *= channels;
|
||||||
//Logger::info("Voice: decoded Opus chunk {} bytes -> {} samples", opusLength, decodedSamples);
|
//Logger::info("Voice: decoded Opus chunk {} bytes -> {} samples", opusLength, decodedSamples);
|
||||||
|
|
||||||
speaker->decibelLevel = getAudioLoudness(decodeBuffer, decodedSamples);
|
|
||||||
{
|
{
|
||||||
MutexLocker lock(speaker->audioStream->mutex);
|
MutexLocker lock(speaker->audioStream->mutex);
|
||||||
auto& samples = speaker->audioStream->samples;
|
auto& samples = speaker->audioStream->samples;
|
||||||
|
@ -18,6 +18,8 @@ typedef std::unique_ptr<OpusEncoder, void(*)(OpusEncoder*)> OpusEncoderPtr;
|
|||||||
|
|
||||||
namespace Star {
|
namespace Star {
|
||||||
|
|
||||||
|
String const VoiceBroadcastPrefix = "Voice\0"s;
|
||||||
|
|
||||||
STAR_EXCEPTION(VoiceException, StarException);
|
STAR_EXCEPTION(VoiceException, StarException);
|
||||||
|
|
||||||
enum class VoiceInputMode : uint8_t { VoiceActivity, PushToTalk };
|
enum class VoiceInputMode : uint8_t { VoiceActivity, PushToTalk };
|
||||||
|
@ -1212,6 +1212,10 @@ void WorldClient::waitForLighting() {
|
|||||||
MutexLocker lock(m_lightingMutex);
|
MutexLocker lock(m_lightingMutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WorldClient::BroadcastCallback& WorldClient::broadcastCallback() {
|
||||||
|
return m_broadcastCallback;
|
||||||
|
}
|
||||||
|
|
||||||
bool WorldClient::isTileProtected(Vec2I const& pos) const {
|
bool WorldClient::isTileProtected(Vec2I const& pos) const {
|
||||||
if (!inWorld())
|
if (!inWorld())
|
||||||
return true;
|
return true;
|
||||||
@ -1905,8 +1909,10 @@ bool WorldClient::sendSecretBroadcast(StringView broadcast, bool raw) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool WorldClient::handleSecretBroadcast(PlayerPtr player, StringView broadcast) {
|
bool WorldClient::handleSecretBroadcast(PlayerPtr player, StringView broadcast) {
|
||||||
Logger::info("Received broadcast '{}'", broadcast);
|
if (m_broadcastCallback)
|
||||||
return true;
|
return m_broadcastCallback(player, broadcast);
|
||||||
|
else
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -166,6 +166,8 @@ public:
|
|||||||
|
|
||||||
void waitForLighting();
|
void waitForLighting();
|
||||||
|
|
||||||
|
typedef std::function<bool(PlayerPtr, StringView)> BroadcastCallback;
|
||||||
|
BroadcastCallback& broadcastCallback();
|
||||||
private:
|
private:
|
||||||
static const float DropDist;
|
static const float DropDist;
|
||||||
|
|
||||||
@ -345,6 +347,8 @@ private:
|
|||||||
HashMap<Uuid, RpcPromiseKeeper<InteractAction>> m_entityInteractionResponses;
|
HashMap<Uuid, RpcPromiseKeeper<InteractAction>> m_entityInteractionResponses;
|
||||||
|
|
||||||
List<PhysicsForceRegion> m_forceRegions;
|
List<PhysicsForceRegion> m_forceRegions;
|
||||||
|
|
||||||
|
BroadcastCallback m_broadcastCallback;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user