Skip to content

Commit

Permalink
supports custom surround params
Browse files Browse the repository at this point in the history
  • Loading branch information
mariotaku committed Apr 15, 2024
1 parent 14ed89d commit fd72e35
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 0 deletions.
10 changes: 10 additions & 0 deletions src/audio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,10 @@ namespace audio {
encodeThread(sample_queue_t samples, config_t config, void *channel_data) {
auto packets = mail::man->queue<packet_t>(mail::audio_packets);
auto stream = &stream_configs[map_stream(config.channels, config.flags[config_t::HIGH_QUALITY])];
if (config.flags[config_t::CUSTOM_SURROUND_PARAMS]) {
// sampleRate and bitrate are already updated in capture function
stream = &config.customStreamConfig;
}

// Encoding takes place on this thread
platf::adjust_thread_priority(platf::thread_priority_e::high);
Expand Down Expand Up @@ -136,6 +140,12 @@ namespace audio {
capture(safe::mail_t mail, config_t config, void *channel_data) {
auto shutdown_event = mail->event<bool>(mail::shutdown);
auto stream = &stream_configs[map_stream(config.channels, config.flags[config_t::HIGH_QUALITY])];
if (config.flags[config_t::CUSTOM_SURROUND_PARAMS]) {
auto orig = stream;
stream = &config.customStreamConfig;
stream->sampleRate = orig->sampleRate;
stream->bitrate = orig->bitrate;
}

auto ref = control_shared.ref();
if (!ref) {
Expand Down
4 changes: 4 additions & 0 deletions src/audio.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,17 @@ namespace audio {
enum flags_e : int {
HIGH_QUALITY,
HOST_AUDIO,
CUSTOM_SURROUND_PARAMS,
MAX_FLAGS
};

int packetDuration;
int channels;
int mask;

std::uint8_t customStreamMapping[8];
opus_stream_config_t customStreamConfig;

std::bitset<MAX_FLAGS> flags;
};

Expand Down
1 change: 1 addition & 0 deletions src/nvhttp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,7 @@ namespace nvhttp {
launch_session->appid = util::from_view(get_arg(args, "appid", "unknown"));
launch_session->enable_sops = util::from_view(get_arg(args, "sops", "0"));
launch_session->surround_info = util::from_view(get_arg(args, "surroundAudioInfo", "196610"));
launch_session->surround_params = (get_arg(args, "surroundParams", ""));
launch_session->gcmap = util::from_view(get_arg(args, "gcmap", "0"));
launch_session->enable_hdr = util::from_view(get_arg(args, "hdrMode", "0"));

Expand Down
1 change: 1 addition & 0 deletions src/process.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ namespace proc {
_env["SUNSHINE_CLIENT_AUDIO_CONFIGURATION"] = "7.1";
break;
}
_env["SUNSHINE_CLIENT_AUDIO_SURROUND_PARAMS"] = launch_session->surround_params;

if (!_app.output.empty() && _app.output != "null"sv) {
#ifdef _WIN32
Expand Down
29 changes: 29 additions & 0 deletions src/rtsp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -818,6 +818,12 @@ namespace rtsp_stream {
ss << "a=rtpmap:98 AV1/90000"sv << std::endl;
}

if (!session.surround_params.empty()) {
// If we have our own surround parameters, advertise them twice first
ss << "a=fmtp:97 surround-params="sv << session.surround_params << std::endl;
ss << "a=fmtp:97 surround-params="sv << session.surround_params << std::endl;
}

for (int x = 0; x < audio::MAX_STREAM_CONFIG; ++x) {
auto &stream_config = audio::stream_configs[x];
std::uint8_t mapping[platf::speaker::MAX_SPEAKERS];
Expand Down Expand Up @@ -1031,6 +1037,29 @@ namespace rtsp_stream {
config.audio.flags[audio::config_t::HIGH_QUALITY] = (content.find("0.0.0.0"sv) == std::string::npos);
}
}
} else if (session.surround_params.length() > 3) {
// Channels
std::uint8_t c = session.surround_params[0] - '0';
// Streams
std::uint8_t n = session.surround_params[1] - '0';
// Coupled streams
std::uint8_t m = session.surround_params[2] - '0';
auto valid = false;
if ((c == 6 || c == 8) && c == config.audio.channels && n + m == c && session.surround_params.length() == c + 3) {
config.audio.customStreamConfig.channelCount = c;
config.audio.customStreamConfig.streams = n;
config.audio.customStreamConfig.coupledStreams = m;
config.audio.customStreamConfig.mapping = config.audio.customStreamMapping;
valid = true;
for (std::uint8_t i = 0; i < c; i++) {
config.audio.customStreamMapping[i] = session.surround_params[i + 3] - '0';
if (config.audio.customStreamMapping[i] >= c) {
valid = false;
break;
}
}
}
config.audio.flags[audio::config_t::CUSTOM_SURROUND_PARAMS] = valid;
}

// If the client sent a configured bitrate, we will choose the actual bitrate ourselves
Expand Down
1 change: 1 addition & 0 deletions src/rtsp.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ namespace rtsp_stream {
int gcmap;
int appid;
int surround_info;
std::string surround_params;
bool enable_hdr;
bool enable_sops;

Expand Down

0 comments on commit fd72e35

Please sign in to comment.