From 4e4ed5aac0539aeb477146d6abaa35a67a8e6547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=97=B1=20PixelyIon?= Date: Sat, 18 Apr 2020 02:53:38 +0530 Subject: [PATCH] Refactor Audio This commit refactors a lot of audio by fixing a lot of nitpicks here and there. --- app/CMakeLists.txt | 6 +- app/src/main/cpp/skyline/audio/common.h | 16 +- app/src/main/cpp/skyline/audio/resampler.cpp | 202 +++++++++--------- app/src/main/cpp/skyline/audio/resampler.h | 2 +- app/src/main/cpp/skyline/audio/track.cpp | 16 +- app/src/main/cpp/skyline/audio/track.h | 10 +- .../cpp/skyline/services/audio/IAudioOut.cpp | 2 +- .../cpp/skyline/services/audio/IAudioOut.h | 6 +- .../services/audio/IAudioOutManager.cpp | 2 +- .../skyline/services/audio/IAudioOutManager.h | 1 + .../services/audio/IAudioRenderer/voice.cpp | 55 ++--- .../services/audio/IAudioRenderer/voice.h | 26 +-- .../services/audio/IAudioRendererManager.cpp | 23 +- 13 files changed, 186 insertions(+), 181 deletions(-) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 5275abd8..74ef1e85 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -26,14 +26,14 @@ include_directories(${source_DIR}/skyline) add_library(skyline SHARED ${source_DIR}/main.cpp - ${source_DIR}/skyline/audio.cpp - ${source_DIR}/skyline/audio/track.cpp - ${source_DIR}/skyline/audio/resampler.cpp ${source_DIR}/skyline/common.cpp ${source_DIR}/skyline/nce/guest.S ${source_DIR}/skyline/nce/guest.cpp ${source_DIR}/skyline/nce.cpp ${source_DIR}/skyline/jvm.cpp + ${source_DIR}/skyline/audio.cpp + ${source_DIR}/skyline/audio/track.cpp + ${source_DIR}/skyline/audio/resampler.cpp ${source_DIR}/skyline/gpu.cpp ${source_DIR}/skyline/gpu/texture.cpp ${source_DIR}/skyline/os.cpp diff --git a/app/src/main/cpp/skyline/audio/common.h b/app/src/main/cpp/skyline/audio/common.h index e0bf2bf4..c54a6f0d 100644 --- a/app/src/main/cpp/skyline/audio/common.h +++ b/app/src/main/cpp/skyline/audio/common.h @@ -8,23 +8,23 @@ namespace skyline { namespace constant { - constexpr auto SampleRate = 48000; //!< The sampling rate to use for the oboe audio output - constexpr auto ChannelCount = 2; //!< The amount of channels to use for the oboe audio output - constexpr auto PcmFormat = oboe::AudioFormat::I16; //!< The pcm data format to use for the oboe audio output + constexpr auto SampleRate = 48000; //!< The common sampling rate to use for audio output + constexpr auto ChannelCount = 2; //!< The common amount of channels to use for audio output + constexpr auto PcmFormat = oboe::AudioFormat::I16; //!< The common PCM data format to use for audio output }; namespace audio { /** * @brief The available PCM stream formats */ - enum class PcmFormat : u8 { + enum class AudioFormat : u8 { Invalid = 0, //!< An invalid PCM format Int8 = 1, //!< 8 bit integer PCM Int16 = 2, //!< 16 bit integer PCM Int24 = 3, //!< 24 bit integer PCM Int32 = 4, //!< 32 bit integer PCM - PcmFloat = 5, //!< Floating point PCM - AdPcm = 6 //!< Adaptive differential PCM + Float = 5, //!< Floating point PCM + ADPCM = 6 //!< Adaptive differential PCM }; /** @@ -37,12 +37,12 @@ namespace skyline { }; /** - * @brief Stores various information about pushed buffers + * @brief This stores information about pushed buffers */ struct BufferIdentifier { u64 tag; //!< The tag of the buffer u64 finalSample; //!< The final sample this buffer will be played in - bool released; //!< Whether the buffer has been released + bool released; //!< If the buffer has been released }; } } diff --git a/app/src/main/cpp/skyline/audio/resampler.cpp b/app/src/main/cpp/skyline/audio/resampler.cpp index 9f3a829e..365bec3e 100644 --- a/app/src/main/cpp/skyline/audio/resampler.cpp +++ b/app/src/main/cpp/skyline/audio/resampler.cpp @@ -14,108 +14,108 @@ namespace skyline::audio { }; constexpr std::array CurveLut0 = {{ - {6600, 19426, 6722, 3}, {6479, 19424, 6845, 9}, {6359, 19419, 6968, 15}, {6239, 19412, 7093, 22}, - {6121, 19403, 7219, 28}, {6004, 19391, 7345, 34}, {5888, 19377, 7472, 41}, {5773, 19361, 7600, 48}, - {5659, 19342, 7728, 55}, {5546, 19321, 7857, 62}, {5434, 19298, 7987, 69}, {5323, 19273, 8118, 77}, - {5213, 19245, 8249, 84}, {5104, 19215, 8381, 92}, {4997, 19183, 8513, 101}, {4890, 19148, 8646, 109}, - {4785, 19112, 8780, 118}, {4681, 19073, 8914, 127}, {4579, 19031, 9048, 137}, {4477, 18988, 9183, 147}, - {4377, 18942, 9318, 157}, {4277, 18895, 9454, 168}, {4179, 18845, 9590, 179}, {4083, 18793, 9726, 190}, - {3987, 18738, 9863, 202}, {3893, 18682, 10000, 215}, {3800, 18624, 10137, 228}, {3709, 18563, 10274, 241}, - {3618, 18500, 10411, 255}, {3529, 18436, 10549, 270}, {3441, 18369, 10687, 285}, {3355, 18300, 10824, 300}, - {3269, 18230, 10962, 317}, {3186, 18157, 11100, 334}, {3103, 18082, 11238, 351}, {3022, 18006, 11375, 369}, - {2942, 17927, 11513, 388}, {2863, 17847, 11650, 408}, {2785, 17765, 11788, 428}, {2709, 17681, 11925, 449}, - {2635, 17595, 12062, 471}, {2561, 17507, 12198, 494}, {2489, 17418, 12334, 517}, {2418, 17327, 12470, 541}, - {2348, 17234, 12606, 566}, {2280, 17140, 12741, 592}, {2213, 17044, 12876, 619}, {2147, 16946, 13010, 647}, - {2083, 16846, 13144, 675}, {2020, 16745, 13277, 704}, {1958, 16643, 13409, 735}, {1897, 16539, 13541, 766}, - {1838, 16434, 13673, 798}, {1780, 16327, 13803, 832}, {1723, 16218, 13933, 866}, {1667, 16109, 14062, 901}, - {1613, 15998, 14191, 937}, {1560, 15885, 14318, 975}, {1508, 15772, 14445, 1013}, {1457, 15657, 14571, 1052}, - {1407, 15540, 14695, 1093}, {1359, 15423, 14819, 1134}, {1312, 15304, 14942, 1177}, {1266, 15185, 15064, 1221}, - {1221, 15064, 15185, 1266}, {1177, 14942, 15304, 1312}, {1134, 14819, 15423, 1359}, {1093, 14695, 15540, 1407}, - {1052, 14571, 15657, 1457}, {1013, 14445, 15772, 1508}, {975, 14318, 15885, 1560}, {937, 14191, 15998, 1613}, - {901, 14062, 16109, 1667}, {866, 13933, 16218, 1723}, {832, 13803, 16327, 1780}, {798, 13673, 16434, 1838}, - {766, 13541, 16539, 1897}, {735, 13409, 16643, 1958}, {704, 13277, 16745, 2020}, {675, 13144, 16846, 2083}, - {647, 13010, 16946, 2147}, {619, 12876, 17044, 2213}, {592, 12741, 17140, 2280}, {566, 12606, 17234, 2348}, - {541, 12470, 17327, 2418}, {517, 12334, 17418, 2489}, {494, 12198, 17507, 2561}, {471, 12062, 17595, 2635}, - {449, 11925, 17681, 2709}, {428, 11788, 17765, 2785}, {408, 11650, 17847, 2863}, {388, 11513, 17927, 2942}, - {369, 11375, 18006, 3022}, {351, 11238, 18082, 3103}, {334, 11100, 18157, 3186}, {317, 10962, 18230, 3269}, - {300, 10824, 18300, 3355}, {285, 10687, 18369, 3441}, {270, 10549, 18436, 3529}, {255, 10411, 18500, 3618}, - {241, 10274, 18563, 3709}, {228, 10137, 18624, 3800}, {215, 10000, 18682, 3893}, {202, 9863, 18738, 3987}, - {190, 9726, 18793, 4083}, {179, 9590, 18845, 4179}, {168, 9454, 18895, 4277}, {157, 9318, 18942, 4377}, - {147, 9183, 18988, 4477}, {137, 9048, 19031, 4579}, {127, 8914, 19073, 4681}, {118, 8780, 19112, 4785}, - {109, 8646, 19148, 4890}, {101, 8513, 19183, 4997}, {92, 8381, 19215, 5104}, {84, 8249, 19245, 5213}, - {77, 8118, 19273, 5323}, {69, 7987, 19298, 5434}, {62, 7857, 19321, 5546}, {55, 7728, 19342, 5659}, - {48, 7600, 19361, 5773}, {41, 7472, 19377, 5888}, {34, 7345, 19391, 6004}, {28, 7219, 19403, 6121}, - {22, 7093, 19412, 6239}, {15, 6968, 19419, 6359}, {9, 6845, 19424, 6479}, {3, 6722, 19426, 6600}}}; + {6600, 19426, 6722, 3}, {6479, 19424, 6845, 9}, {6359, 19419, 6968, 15}, {6239, 19412, 7093, 22}, + {6121, 19403, 7219, 28}, {6004, 19391, 7345, 34}, {5888, 19377, 7472, 41}, {5773, 19361, 7600, 48}, + {5659, 19342, 7728, 55}, {5546, 19321, 7857, 62}, {5434, 19298, 7987, 69}, {5323, 19273, 8118, 77}, + {5213, 19245, 8249, 84}, {5104, 19215, 8381, 92}, {4997, 19183, 8513, 101}, {4890, 19148, 8646, 109}, + {4785, 19112, 8780, 118}, {4681, 19073, 8914, 127}, {4579, 19031, 9048, 137}, {4477, 18988, 9183, 147}, + {4377, 18942, 9318, 157}, {4277, 18895, 9454, 168}, {4179, 18845, 9590, 179}, {4083, 18793, 9726, 190}, + {3987, 18738, 9863, 202}, {3893, 18682, 10000, 215}, {3800, 18624, 10137, 228}, {3709, 18563, 10274, 241}, + {3618, 18500, 10411, 255}, {3529, 18436, 10549, 270}, {3441, 18369, 10687, 285}, {3355, 18300, 10824, 300}, + {3269, 18230, 10962, 317}, {3186, 18157, 11100, 334}, {3103, 18082, 11238, 351}, {3022, 18006, 11375, 369}, + {2942, 17927, 11513, 388}, {2863, 17847, 11650, 408}, {2785, 17765, 11788, 428}, {2709, 17681, 11925, 449}, + {2635, 17595, 12062, 471}, {2561, 17507, 12198, 494}, {2489, 17418, 12334, 517}, {2418, 17327, 12470, 541}, + {2348, 17234, 12606, 566}, {2280, 17140, 12741, 592}, {2213, 17044, 12876, 619}, {2147, 16946, 13010, 647}, + {2083, 16846, 13144, 675}, {2020, 16745, 13277, 704}, {1958, 16643, 13409, 735}, {1897, 16539, 13541, 766}, + {1838, 16434, 13673, 798}, {1780, 16327, 13803, 832}, {1723, 16218, 13933, 866}, {1667, 16109, 14062, 901}, + {1613, 15998, 14191, 937}, {1560, 15885, 14318, 975}, {1508, 15772, 14445, 1013}, {1457, 15657, 14571, 1052}, + {1407, 15540, 14695, 1093}, {1359, 15423, 14819, 1134}, {1312, 15304, 14942, 1177}, {1266, 15185, 15064, 1221}, + {1221, 15064, 15185, 1266}, {1177, 14942, 15304, 1312}, {1134, 14819, 15423, 1359}, {1093, 14695, 15540, 1407}, + {1052, 14571, 15657, 1457}, {1013, 14445, 15772, 1508}, {975, 14318, 15885, 1560}, {937, 14191, 15998, 1613}, + {901, 14062, 16109, 1667}, {866, 13933, 16218, 1723}, {832, 13803, 16327, 1780}, {798, 13673, 16434, 1838}, + {766, 13541, 16539, 1897}, {735, 13409, 16643, 1958}, {704, 13277, 16745, 2020}, {675, 13144, 16846, 2083}, + {647, 13010, 16946, 2147}, {619, 12876, 17044, 2213}, {592, 12741, 17140, 2280}, {566, 12606, 17234, 2348}, + {541, 12470, 17327, 2418}, {517, 12334, 17418, 2489}, {494, 12198, 17507, 2561}, {471, 12062, 17595, 2635}, + {449, 11925, 17681, 2709}, {428, 11788, 17765, 2785}, {408, 11650, 17847, 2863}, {388, 11513, 17927, 2942}, + {369, 11375, 18006, 3022}, {351, 11238, 18082, 3103}, {334, 11100, 18157, 3186}, {317, 10962, 18230, 3269}, + {300, 10824, 18300, 3355}, {285, 10687, 18369, 3441}, {270, 10549, 18436, 3529}, {255, 10411, 18500, 3618}, + {241, 10274, 18563, 3709}, {228, 10137, 18624, 3800}, {215, 10000, 18682, 3893}, {202, 9863, 18738, 3987}, + {190, 9726, 18793, 4083}, {179, 9590, 18845, 4179}, {168, 9454, 18895, 4277}, {157, 9318, 18942, 4377}, + {147, 9183, 18988, 4477}, {137, 9048, 19031, 4579}, {127, 8914, 19073, 4681}, {118, 8780, 19112, 4785}, + {109, 8646, 19148, 4890}, {101, 8513, 19183, 4997}, {92, 8381, 19215, 5104}, {84, 8249, 19245, 5213}, + {77, 8118, 19273, 5323}, {69, 7987, 19298, 5434}, {62, 7857, 19321, 5546}, {55, 7728, 19342, 5659}, + {48, 7600, 19361, 5773}, {41, 7472, 19377, 5888}, {34, 7345, 19391, 6004}, {28, 7219, 19403, 6121}, + {22, 7093, 19412, 6239}, {15, 6968, 19419, 6359}, {9, 6845, 19424, 6479}, {3, 6722, 19426, 6600}}}; constexpr std::array CurveLut1 = {{ - {-68, 32639, 69, -5}, {-200, 32630, 212, -15}, {-328, 32613, 359, -26}, {-450, 32586, 512, -36}, - {-568, 32551, 669, -47}, {-680, 32507, 832, -58}, {-788, 32454, 1000, -69}, {-891, 32393, 1174, -80}, - {-990, 32323, 1352, -92}, {-1084, 32244, 1536, -103}, {-1173, 32157, 1724, -115}, {-1258, 32061, 1919, -128}, - {-1338, 31956, 2118, -140}, {-1414, 31844, 2322, -153}, {-1486, 31723, 2532, -167}, {-1554, 31593, 2747, -180}, - {-1617, 31456, 2967, -194}, {-1676, 31310, 3192, -209}, {-1732, 31157, 3422, -224}, {-1783, 30995, 3657, -240}, - {-1830, 30826, 3897, -256}, {-1874, 30649, 4143, -272}, {-1914, 30464, 4393, -289}, {-1951, 30272, 4648, -307}, - {-1984, 30072, 4908, -325}, {-2014, 29866, 5172, -343}, {-2040, 29652, 5442, -362}, {-2063, 29431, 5716, -382}, - {-2083, 29203, 5994, -403}, {-2100, 28968, 6277, -424}, {-2114, 28727, 6565, -445}, {-2125, 28480, 6857, -468}, - {-2133, 28226, 7153, -490}, {-2139, 27966, 7453, -514}, {-2142, 27700, 7758, -538}, {-2142, 27428, 8066, -563}, - {-2141, 27151, 8378, -588}, {-2136, 26867, 8694, -614}, {-2130, 26579, 9013, -641}, {-2121, 26285, 9336, -668}, - {-2111, 25987, 9663, -696}, {-2098, 25683, 9993, -724}, {-2084, 25375, 10326, -753}, {-2067, 25063, 10662, -783}, - {-2049, 24746, 11000, -813}, {-2030, 24425, 11342, -844}, {-2009, 24100, 11686, -875}, {-1986, 23771, 12033, -907}, - {-1962, 23438, 12382, -939}, {-1937, 23103, 12733, -972}, {-1911, 22764, 13086, -1005}, {-1883, 22422, 13441, -1039}, - {-1855, 22077, 13798, -1072}, {-1825, 21729, 14156, -1107}, {-1795, 21380, 14516, -1141}, {-1764, 21027, 14877, -1176}, - {-1732, 20673, 15239, -1211}, {-1700, 20317, 15602, -1246}, {-1667, 19959, 15965, -1282}, {-1633, 19600, 16329, -1317}, - {-1599, 19239, 16694, -1353}, {-1564, 18878, 17058, -1388}, {-1530, 18515, 17423, -1424}, {-1495, 18151, 17787, -1459}, - {-1459, 17787, 18151, -1495}, {-1424, 17423, 18515, -1530}, {-1388, 17058, 18878, -1564}, {-1353, 16694, 19239, -1599}, - {-1317, 16329, 19600, -1633}, {-1282, 15965, 19959, -1667}, {-1246, 15602, 20317, -1700}, {-1211, 15239, 20673, -1732}, - {-1176, 14877, 21027, -1764}, {-1141, 14516, 21380, -1795}, {-1107, 14156, 21729, -1825}, {-1072, 13798, 22077, -1855}, - {-1039, 13441, 22422, -1883}, {-1005, 13086, 22764, -1911}, {-972, 12733, 23103, -1937}, {-939, 12382, 23438, -1962}, - {-907, 12033, 23771, -1986}, {-875, 11686, 24100, -2009}, {-844, 11342, 24425, -2030}, {-813, 11000, 24746, -2049}, - {-783, 10662, 25063, -2067}, {-753, 10326, 25375, -2084}, {-724, 9993, 25683, -2098}, {-696, 9663, 25987, -2111}, - {-668, 9336, 26285, -2121}, {-641, 9013, 26579, -2130}, {-614, 8694, 26867, -2136}, {-588, 8378, 27151, -2141}, - {-563, 8066, 27428, -2142}, {-538, 7758, 27700, -2142}, {-514, 7453, 27966, -2139}, {-490, 7153, 28226, -2133}, - {-468, 6857, 28480, -2125}, {-445, 6565, 28727, -2114}, {-424, 6277, 28968, -2100}, {-403, 5994, 29203, -2083}, - {-382, 5716, 29431, -2063}, {-362, 5442, 29652, -2040}, {-343, 5172, 29866, -2014}, {-325, 4908, 30072, -1984}, - {-307, 4648, 30272, -1951}, {-289, 4393, 30464, -1914}, {-272, 4143, 30649, -1874}, {-256, 3897, 30826, -1830}, - {-240, 3657, 30995, -1783}, {-224, 3422, 31157, -1732}, {-209, 3192, 31310, -1676}, {-194, 2967, 31456, -1617}, - {-180, 2747, 31593, -1554}, {-167, 2532, 31723, -1486}, {-153, 2322, 31844, -1414}, {-140, 2118, 31956, -1338}, - {-128, 1919, 32061, -1258}, {-115, 1724, 32157, -1173}, {-103, 1536, 32244, -1084}, {-92, 1352, 32323, -990}, - {-80, 1174, 32393, -891}, {-69, 1000, 32454, -788}, {-58, 832, 32507, -680}, {-47, 669, 32551, -568}, - {-36, 512, 32586, -450}, {-26, 359, 32613, -328}, {-15, 212, 32630, -200}, {-5, 69, 32639, -68}}}; + {-68, 32639, 69, -5}, {-200, 32630, 212, -15}, {-328, 32613, 359, -26}, {-450, 32586, 512, -36}, + {-568, 32551, 669, -47}, {-680, 32507, 832, -58}, {-788, 32454, 1000, -69}, {-891, 32393, 1174, -80}, + {-990, 32323, 1352, -92}, {-1084, 32244, 1536, -103}, {-1173, 32157, 1724, -115}, {-1258, 32061, 1919, -128}, + {-1338, 31956, 2118, -140}, {-1414, 31844, 2322, -153}, {-1486, 31723, 2532, -167}, {-1554, 31593, 2747, -180}, + {-1617, 31456, 2967, -194}, {-1676, 31310, 3192, -209}, {-1732, 31157, 3422, -224}, {-1783, 30995, 3657, -240}, + {-1830, 30826, 3897, -256}, {-1874, 30649, 4143, -272}, {-1914, 30464, 4393, -289}, {-1951, 30272, 4648, -307}, + {-1984, 30072, 4908, -325}, {-2014, 29866, 5172, -343}, {-2040, 29652, 5442, -362}, {-2063, 29431, 5716, -382}, + {-2083, 29203, 5994, -403}, {-2100, 28968, 6277, -424}, {-2114, 28727, 6565, -445}, {-2125, 28480, 6857, -468}, + {-2133, 28226, 7153, -490}, {-2139, 27966, 7453, -514}, {-2142, 27700, 7758, -538}, {-2142, 27428, 8066, -563}, + {-2141, 27151, 8378, -588}, {-2136, 26867, 8694, -614}, {-2130, 26579, 9013, -641}, {-2121, 26285, 9336, -668}, + {-2111, 25987, 9663, -696}, {-2098, 25683, 9993, -724}, {-2084, 25375, 10326, -753}, {-2067, 25063, 10662, -783}, + {-2049, 24746, 11000, -813}, {-2030, 24425, 11342, -844}, {-2009, 24100, 11686, -875}, {-1986, 23771, 12033, -907}, + {-1962, 23438, 12382, -939}, {-1937, 23103, 12733, -972}, {-1911, 22764, 13086, -1005}, {-1883, 22422, 13441, -1039}, + {-1855, 22077, 13798, -1072}, {-1825, 21729, 14156, -1107}, {-1795, 21380, 14516, -1141}, {-1764, 21027, 14877, -1176}, + {-1732, 20673, 15239, -1211}, {-1700, 20317, 15602, -1246}, {-1667, 19959, 15965, -1282}, {-1633, 19600, 16329, -1317}, + {-1599, 19239, 16694, -1353}, {-1564, 18878, 17058, -1388}, {-1530, 18515, 17423, -1424}, {-1495, 18151, 17787, -1459}, + {-1459, 17787, 18151, -1495}, {-1424, 17423, 18515, -1530}, {-1388, 17058, 18878, -1564}, {-1353, 16694, 19239, -1599}, + {-1317, 16329, 19600, -1633}, {-1282, 15965, 19959, -1667}, {-1246, 15602, 20317, -1700}, {-1211, 15239, 20673, -1732}, + {-1176, 14877, 21027, -1764}, {-1141, 14516, 21380, -1795}, {-1107, 14156, 21729, -1825}, {-1072, 13798, 22077, -1855}, + {-1039, 13441, 22422, -1883}, {-1005, 13086, 22764, -1911}, {-972, 12733, 23103, -1937}, {-939, 12382, 23438, -1962}, + {-907, 12033, 23771, -1986}, {-875, 11686, 24100, -2009}, {-844, 11342, 24425, -2030}, {-813, 11000, 24746, -2049}, + {-783, 10662, 25063, -2067}, {-753, 10326, 25375, -2084}, {-724, 9993, 25683, -2098}, {-696, 9663, 25987, -2111}, + {-668, 9336, 26285, -2121}, {-641, 9013, 26579, -2130}, {-614, 8694, 26867, -2136}, {-588, 8378, 27151, -2141}, + {-563, 8066, 27428, -2142}, {-538, 7758, 27700, -2142}, {-514, 7453, 27966, -2139}, {-490, 7153, 28226, -2133}, + {-468, 6857, 28480, -2125}, {-445, 6565, 28727, -2114}, {-424, 6277, 28968, -2100}, {-403, 5994, 29203, -2083}, + {-382, 5716, 29431, -2063}, {-362, 5442, 29652, -2040}, {-343, 5172, 29866, -2014}, {-325, 4908, 30072, -1984}, + {-307, 4648, 30272, -1951}, {-289, 4393, 30464, -1914}, {-272, 4143, 30649, -1874}, {-256, 3897, 30826, -1830}, + {-240, 3657, 30995, -1783}, {-224, 3422, 31157, -1732}, {-209, 3192, 31310, -1676}, {-194, 2967, 31456, -1617}, + {-180, 2747, 31593, -1554}, {-167, 2532, 31723, -1486}, {-153, 2322, 31844, -1414}, {-140, 2118, 31956, -1338}, + {-128, 1919, 32061, -1258}, {-115, 1724, 32157, -1173}, {-103, 1536, 32244, -1084}, {-92, 1352, 32323, -990}, + {-80, 1174, 32393, -891}, {-69, 1000, 32454, -788}, {-58, 832, 32507, -680}, {-47, 669, 32551, -568}, + {-36, 512, 32586, -450}, {-26, 359, 32613, -328}, {-15, 212, 32630, -200}, {-5, 69, 32639, -68}}}; constexpr std::array CurveLut2 = {{ - {3195, 26287, 3329, -32}, {3064, 26281, 3467, -34}, {2936, 26270, 3608, -38}, {2811, 26253, 3751, -42}, - {2688, 26230, 3897, -46}, {2568, 26202, 4046, -50}, {2451, 26169, 4199, -54}, {2338, 26130, 4354, -58}, - {2227, 26085, 4512, -63}, {2120, 26035, 4673, -67}, {2015, 25980, 4837, -72}, {1912, 25919, 5004, -76}, - {1813, 25852, 5174, -81}, {1716, 25780, 5347, -87}, {1622, 25704, 5522, -92}, {1531, 25621, 5701, -98}, - {1442, 25533, 5882, -103}, {1357, 25440, 6066, -109}, {1274, 25342, 6253, -115}, {1193, 25239, 6442, -121}, - {1115, 25131, 6635, -127}, {1040, 25018, 6830, -133}, {967, 24899, 7027, -140}, {897, 24776, 7227, -146}, - {829, 24648, 7430, -153}, {764, 24516, 7635, -159}, {701, 24379, 7842, -166}, {641, 24237, 8052, -174}, - {583, 24091, 8264, -181}, {526, 23940, 8478, -187}, {472, 23785, 8695, -194}, {420, 23626, 8914, -202}, - {371, 23462, 9135, -209}, {324, 23295, 9358, -215}, {279, 23123, 9583, -222}, {236, 22948, 9809, -230}, - {194, 22769, 10038, -237}, {154, 22586, 10269, -243}, {117, 22399, 10501, -250}, {81, 22208, 10735, -258}, - {47, 22015, 10970, -265}, {15, 21818, 11206, -271}, {-16, 21618, 11444, -277}, {-44, 21415, 11684, -283}, - {-71, 21208, 11924, -290}, {-97, 20999, 12166, -296}, {-121, 20786, 12409, -302}, {-143, 20571, 12653, -306}, - {-163, 20354, 12898, -311}, {-183, 20134, 13143, -316}, {-201, 19911, 13389, -321}, {-218, 19686, 13635, -325}, - {-234, 19459, 13882, -328}, {-248, 19230, 14130, -332}, {-261, 18998, 14377, -335}, {-273, 18765, 14625, -337}, - {-284, 18531, 14873, -339}, {-294, 18295, 15121, -341}, {-302, 18057, 15369, -341}, {-310, 17817, 15617, -341}, - {-317, 17577, 15864, -340}, {-323, 17335, 16111, -340}, {-328, 17092, 16357, -338}, {-332, 16848, 16603, -336}, - {-336, 16603, 16848, -332}, {-338, 16357, 17092, -328}, {-340, 16111, 17335, -323}, {-340, 15864, 17577, -317}, - {-341, 15617, 17817, -310}, {-341, 15369, 18057, -302}, {-341, 15121, 18295, -294}, {-339, 14873, 18531, -284}, - {-337, 14625, 18765, -273}, {-335, 14377, 18998, -261}, {-332, 14130, 19230, -248}, {-328, 13882, 19459, -234}, - {-325, 13635, 19686, -218}, {-321, 13389, 19911, -201}, {-316, 13143, 20134, -183}, {-311, 12898, 20354, -163}, - {-306, 12653, 20571, -143}, {-302, 12409, 20786, -121}, {-296, 12166, 20999, -97}, {-290, 11924, 21208, -71}, - {-283, 11684, 21415, -44}, {-277, 11444, 21618, -16}, {-271, 11206, 21818, 15}, {-265, 10970, 22015, 47}, - {-258, 10735, 22208, 81}, {-250, 10501, 22399, 117}, {-243, 10269, 22586, 154}, {-237, 10038, 22769, 194}, - {-230, 9809, 22948, 236}, {-222, 9583, 23123, 279}, {-215, 9358, 23295, 324}, {-209, 9135, 23462, 371}, - {-202, 8914, 23626, 420}, {-194, 8695, 23785, 472}, {-187, 8478, 23940, 526}, {-181, 8264, 24091, 583}, - {-174, 8052, 24237, 641}, {-166, 7842, 24379, 701}, {-159, 7635, 24516, 764}, {-153, 7430, 24648, 829}, - {-146, 7227, 24776, 897}, {-140, 7027, 24899, 967}, {-133, 6830, 25018, 1040}, {-127, 6635, 25131, 1115}, - {-121, 6442, 25239, 1193}, {-115, 6253, 25342, 1274}, {-109, 6066, 25440, 1357}, {-103, 5882, 25533, 1442}, - {-98, 5701, 25621, 1531}, {-92, 5522, 25704, 1622}, {-87, 5347, 25780, 1716}, {-81, 5174, 25852, 1813}, - {-76, 5004, 25919, 1912}, {-72, 4837, 25980, 2015}, {-67, 4673, 26035, 2120}, {-63, 4512, 26085, 2227}, - {-58, 4354, 26130, 2338}, {-54, 4199, 26169, 2451}, {-50, 4046, 26202, 2568}, {-46, 3897, 26230, 2688}, - {-42, 3751, 26253, 2811}, {-38, 3608, 26270, 2936}, {-34, 3467, 26281, 3064}, {-32, 3329, 26287, 3195}}}; + {3195, 26287, 3329, -32}, {3064, 26281, 3467, -34}, {2936, 26270, 3608, -38}, {2811, 26253, 3751, -42}, + {2688, 26230, 3897, -46}, {2568, 26202, 4046, -50}, {2451, 26169, 4199, -54}, {2338, 26130, 4354, -58}, + {2227, 26085, 4512, -63}, {2120, 26035, 4673, -67}, {2015, 25980, 4837, -72}, {1912, 25919, 5004, -76}, + {1813, 25852, 5174, -81}, {1716, 25780, 5347, -87}, {1622, 25704, 5522, -92}, {1531, 25621, 5701, -98}, + {1442, 25533, 5882, -103}, {1357, 25440, 6066, -109}, {1274, 25342, 6253, -115}, {1193, 25239, 6442, -121}, + {1115, 25131, 6635, -127}, {1040, 25018, 6830, -133}, {967, 24899, 7027, -140}, {897, 24776, 7227, -146}, + {829, 24648, 7430, -153}, {764, 24516, 7635, -159}, {701, 24379, 7842, -166}, {641, 24237, 8052, -174}, + {583, 24091, 8264, -181}, {526, 23940, 8478, -187}, {472, 23785, 8695, -194}, {420, 23626, 8914, -202}, + {371, 23462, 9135, -209}, {324, 23295, 9358, -215}, {279, 23123, 9583, -222}, {236, 22948, 9809, -230}, + {194, 22769, 10038, -237}, {154, 22586, 10269, -243}, {117, 22399, 10501, -250}, {81, 22208, 10735, -258}, + {47, 22015, 10970, -265}, {15, 21818, 11206, -271}, {-16, 21618, 11444, -277}, {-44, 21415, 11684, -283}, + {-71, 21208, 11924, -290}, {-97, 20999, 12166, -296}, {-121, 20786, 12409, -302}, {-143, 20571, 12653, -306}, + {-163, 20354, 12898, -311}, {-183, 20134, 13143, -316}, {-201, 19911, 13389, -321}, {-218, 19686, 13635, -325}, + {-234, 19459, 13882, -328}, {-248, 19230, 14130, -332}, {-261, 18998, 14377, -335}, {-273, 18765, 14625, -337}, + {-284, 18531, 14873, -339}, {-294, 18295, 15121, -341}, {-302, 18057, 15369, -341}, {-310, 17817, 15617, -341}, + {-317, 17577, 15864, -340}, {-323, 17335, 16111, -340}, {-328, 17092, 16357, -338}, {-332, 16848, 16603, -336}, + {-336, 16603, 16848, -332}, {-338, 16357, 17092, -328}, {-340, 16111, 17335, -323}, {-340, 15864, 17577, -317}, + {-341, 15617, 17817, -310}, {-341, 15369, 18057, -302}, {-341, 15121, 18295, -294}, {-339, 14873, 18531, -284}, + {-337, 14625, 18765, -273}, {-335, 14377, 18998, -261}, {-332, 14130, 19230, -248}, {-328, 13882, 19459, -234}, + {-325, 13635, 19686, -218}, {-321, 13389, 19911, -201}, {-316, 13143, 20134, -183}, {-311, 12898, 20354, -163}, + {-306, 12653, 20571, -143}, {-302, 12409, 20786, -121}, {-296, 12166, 20999, -97}, {-290, 11924, 21208, -71}, + {-283, 11684, 21415, -44}, {-277, 11444, 21618, -16}, {-271, 11206, 21818, 15}, {-265, 10970, 22015, 47}, + {-258, 10735, 22208, 81}, {-250, 10501, 22399, 117}, {-243, 10269, 22586, 154}, {-237, 10038, 22769, 194}, + {-230, 9809, 22948, 236}, {-222, 9583, 23123, 279}, {-215, 9358, 23295, 324}, {-209, 9135, 23462, 371}, + {-202, 8914, 23626, 420}, {-194, 8695, 23785, 472}, {-187, 8478, 23940, 526}, {-181, 8264, 24091, 583}, + {-174, 8052, 24237, 641}, {-166, 7842, 24379, 701}, {-159, 7635, 24516, 764}, {-153, 7430, 24648, 829}, + {-146, 7227, 24776, 897}, {-140, 7027, 24899, 967}, {-133, 6830, 25018, 1040}, {-127, 6635, 25131, 1115}, + {-121, 6442, 25239, 1193}, {-115, 6253, 25342, 1274}, {-109, 6066, 25440, 1357}, {-103, 5882, 25533, 1442}, + {-98, 5701, 25621, 1531}, {-92, 5522, 25704, 1622}, {-87, 5347, 25780, 1716}, {-81, 5174, 25852, 1813}, + {-76, 5004, 25919, 1912}, {-72, 4837, 25980, 2015}, {-67, 4673, 26035, 2120}, {-63, 4512, 26085, 2227}, + {-58, 4354, 26130, 2338}, {-54, 4199, 26169, 2451}, {-50, 4046, 26202, 2568}, {-46, 3897, 26230, 2688}, + {-42, 3751, 26253, 2811}, {-38, 3608, 26270, 2936}, {-34, 3467, 26281, 3064}, {-32, 3329, 26287, 3195}}}; - std::vector Resampler::ResampleBuffer(const std::vector &inputBuffer, double ratio, int channelCount) { + std::vector Resampler::ResampleBuffer(const std::vector &inputBuffer, double ratio, u8 channelCount) { auto step = static_cast(ratio * 0x8000); auto outputSize = static_cast(inputBuffer.size() / ratio); std::vector outputBuffer(outputSize); @@ -132,11 +132,11 @@ namespace skyline::audio { for (auto outIndex = 0, inIndex = 0; outIndex < outputBuffer.size(); outIndex += channelCount) { auto lutIndex = (fraction >> 8) << 2; - for (int channel = 0; channel < channelCount; channel++) { + for (u8 channel = 0; channel < channelCount; channel++) { i32 data = inputBuffer[(inIndex + 0) * channelCount + channel] * lut[lutIndex].a + - inputBuffer[(inIndex + 1) * channelCount + channel] * lut[lutIndex].b + - inputBuffer[(inIndex + 2) * channelCount + channel] * lut[lutIndex].c + - inputBuffer[(inIndex + 3) * channelCount + channel] * lut[lutIndex].d; + inputBuffer[(inIndex + 1) * channelCount + channel] * lut[lutIndex].b + + inputBuffer[(inIndex + 2) * channelCount + channel] * lut[lutIndex].c + + inputBuffer[(inIndex + 3) * channelCount + channel] * lut[lutIndex].d; outputBuffer[outIndex + channel] = static_cast(std::clamp(data >> 15, static_cast(std::numeric_limits::min()), static_cast(std::numeric_limits::max()))); } diff --git a/app/src/main/cpp/skyline/audio/resampler.h b/app/src/main/cpp/skyline/audio/resampler.h index be31ee73..1590bd4e 100644 --- a/app/src/main/cpp/skyline/audio/resampler.h +++ b/app/src/main/cpp/skyline/audio/resampler.h @@ -20,6 +20,6 @@ namespace skyline::audio { * @param ratio The conversion ratio needed * @param channelCount The amount of channels the buffer contains */ - std::vector ResampleBuffer(const std::vector &inputBuffer, double ratio, int channelCount); + std::vector ResampleBuffer(const std::vector &inputBuffer, double ratio, u8 channelCount); }; } diff --git a/app/src/main/cpp/skyline/audio/track.cpp b/app/src/main/cpp/skyline/audio/track.cpp index bd73e884..b8ada88e 100644 --- a/app/src/main/cpp/skyline/audio/track.cpp +++ b/app/src/main/cpp/skyline/audio/track.cpp @@ -4,7 +4,7 @@ #include "track.h" namespace skyline::audio { - AudioTrack::AudioTrack(const int channelCount, const int sampleRate, const std::function &releaseCallback) : channelCount(channelCount), sampleRate(sampleRate), releaseCallback(releaseCallback) { + AudioTrack::AudioTrack(const u8 channelCount, const u32 sampleRate, const std::function &releaseCallback) : channelCount(channelCount), sampleRate(sampleRate), releaseCallback(releaseCallback) { if (sampleRate != constant::SampleRate) throw exception("Unsupported audio sample rate: {}", sampleRate); @@ -13,13 +13,13 @@ namespace skyline::audio { } void AudioTrack::Stop() { - while (!identifierQueue.end()->released); + while (!identifiers.end()->released); playbackState = AudioOutState::Stopped; } bool AudioTrack::ContainsBuffer(u64 tag) { // Iterate from front of queue as we don't want released samples - for (auto identifier = identifierQueue.crbegin(); identifier != identifierQueue.crend(); ++identifier) { + for (auto identifier = identifiers.crbegin(); identifier != identifiers.crend(); ++identifier) { if (identifier->released) return false; @@ -33,11 +33,11 @@ namespace skyline::audio { std::vector AudioTrack::GetReleasedBuffers(u32 max) { std::vector bufferIds; - for (auto i = 0; i < max; i++) { - if (!identifierQueue.back().released) + for (auto index = 0; index < max; index++) { + if (!identifiers.back().released) break; - bufferIds.push_back(identifierQueue.back().tag); - identifierQueue.pop_back(); + bufferIds.push_back(identifiers.back().tag); + identifiers.pop_back(); } return bufferIds; @@ -64,7 +64,7 @@ namespace skyline::audio { } void AudioTrack::CheckReleasedBuffers() { - for (auto &identifier : identifierQueue) { + for (auto &identifier : identifiers) { if (identifier.finalSample <= sampleCounter && !identifier.released) { releaseCallback(); identifier.released = true; diff --git a/app/src/main/cpp/skyline/audio/track.h b/app/src/main/cpp/skyline/audio/track.h index ed0f0f2c..341b1cd9 100644 --- a/app/src/main/cpp/skyline/audio/track.h +++ b/app/src/main/cpp/skyline/audio/track.h @@ -16,14 +16,14 @@ namespace skyline::audio { class AudioTrack { private: const std::function releaseCallback; //!< Callback called when a buffer has been played - std::deque identifierQueue; //!< Queue of all appended buffer identifiers + std::deque identifiers; //!< Queue of all appended buffer identifiers - const int channelCount; //!< The amount channels present in the track - const int sampleRate; //!< The sample rate of the track + const u8 channelCount; //!< The amount channels present in the track + const u32 sampleRate; //!< The sample rate of the track public: std::queue sampleQueue; //!< Queue of all appended buffer data - skyline::Mutex bufferLock; //!< Buffer access lock + Mutex bufferLock; //!< This mutex ensures that appending to buffers doesn't overlap AudioOutState playbackState{AudioOutState::Stopped}; //!< The current state of playback u64 sampleCounter{}; //!< A counter used for tracking buffer status @@ -33,7 +33,7 @@ namespace skyline::audio { * @param sampleRate The sample rate to use for the track * @param releaseCallback A callback to call when a buffer has been played */ - AudioTrack(const int channelCount, const int sampleRate, const std::function &releaseCallback); + AudioTrack(const u8 channelCount, const u32 sampleRate, const std::function &releaseCallback); /** * @brief Starts audio playback using data from appended buffers. diff --git a/app/src/main/cpp/skyline/services/audio/IAudioOut.cpp b/app/src/main/cpp/skyline/services/audio/IAudioOut.cpp index 96def9de..e1788c19 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioOut.cpp +++ b/app/src/main/cpp/skyline/services/audio/IAudioOut.cpp @@ -5,7 +5,7 @@ #include "IAudioOut.h" namespace skyline::service::audio { - IAudioOut::IAudioOut(const DeviceState &state, ServiceManager &manager, const int channelCount, const int sampleRate) : sampleRate(sampleRate), channelCount(channelCount), releaseEvent(std::make_shared(state)), BaseService(state, manager, Service::audio_IAudioOut, "audio:IAudioOut", { + IAudioOut::IAudioOut(const DeviceState &state, ServiceManager &manager, const u8 channelCount, const u32 sampleRate) : sampleRate(sampleRate), channelCount(channelCount), releaseEvent(std::make_shared(state)), BaseService(state, manager, Service::audio_IAudioOut, "audio:IAudioOut", { {0x0, SFUNC(IAudioOut::GetAudioOutState)}, {0x1, SFUNC(IAudioOut::StartAudioOut)}, {0x2, SFUNC(IAudioOut::StopAudioOut)}, diff --git a/app/src/main/cpp/skyline/services/audio/IAudioOut.h b/app/src/main/cpp/skyline/services/audio/IAudioOut.h index dfa6ac43..3ff76736 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioOut.h +++ b/app/src/main/cpp/skyline/services/audio/IAudioOut.h @@ -20,15 +20,15 @@ namespace skyline::service::audio { std::shared_ptr releaseEvent; //!< The KEvent that is signalled when a buffer has been released std::vector tmpSampleBuffer; //!< A temporary buffer used to store sample data in AppendAudioOutBuffer - const int sampleRate; //!< The sample rate of the audio out - const int channelCount; //!< The amount of channels in the data sent to the audio out + const u32 sampleRate; //!< The sample rate of the audio out + const u8 channelCount; //!< The amount of channels in the data sent to the audio out public: /** * @param channelCount The channel count of the audio data the audio out will be fed * @param sampleRate The sample rate of the audio data the audio out will be fed */ - IAudioOut(const DeviceState &state, ServiceManager &manager, const int channelCount, const int sampleRate); + IAudioOut(const DeviceState &state, ServiceManager &manager, const u8 channelCount, const u32 sampleRate); /** * @brief Closes the audio track diff --git a/app/src/main/cpp/skyline/services/audio/IAudioOutManager.cpp b/app/src/main/cpp/skyline/services/audio/IAudioOutManager.cpp index 637cf888..170e8e4a 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioOutManager.cpp +++ b/app/src/main/cpp/skyline/services/audio/IAudioOutManager.cpp @@ -29,7 +29,7 @@ namespace skyline::service::audio { response.Push(sampleRate); response.Push(channelCount); response.Push(0); - response.Push(static_cast(skyline::audio::PcmFormat::Int16)); + response.Push(static_cast(skyline::audio::AudioFormat::Int16)); response.Push(static_cast(skyline::audio::AudioOutState::Stopped)); } } diff --git a/app/src/main/cpp/skyline/services/audio/IAudioOutManager.h b/app/src/main/cpp/skyline/services/audio/IAudioOutManager.h index 51c8f382..9847cc03 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioOutManager.h +++ b/app/src/main/cpp/skyline/services/audio/IAudioOutManager.h @@ -6,6 +6,7 @@ #include #include #include + namespace skyline { namespace constant { constexpr std::string_view DefaultAudioOutName = "DeviceOut"; //!< The default audio output device name diff --git a/app/src/main/cpp/skyline/services/audio/IAudioRenderer/voice.cpp b/app/src/main/cpp/skyline/services/audio/IAudioRenderer/voice.cpp index 081bfe04..9fa676e7 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioRenderer/voice.cpp +++ b/app/src/main/cpp/skyline/services/audio/IAudioRenderer/voice.cpp @@ -5,6 +5,11 @@ #include "voice.h" namespace skyline::service::audio::IAudioRenderer { + void Voice::SetWaveBufferIndex(u8 index) { + bufferIndex = static_cast(index & 3); + bufferReload = true; + } + Voice::Voice(const DeviceState &state) : state(state) {} void Voice::ProcessInput(const VoiceIn &input) { @@ -25,17 +30,18 @@ namespace skyline::service::audio::IAudioRenderer { return; if (input.firstUpdate) { - if (input.pcmFormat != skyline::audio::PcmFormat::Int16) - throw exception("Unsupported voice PCM format: {}", input.pcmFormat); + if (input.format != skyline::audio::AudioFormat::Int16) + throw exception("Unsupported voice PCM format: {}", input.format); - pcmFormat = input.pcmFormat; + format = input.format; sampleRate = input.sampleRate; if (input.channelCount > 2) throw exception("Unsupported voice channel count: {}", input.channelCount); - channelCount = input.channelCount; - SetWaveBufferIndex(input.baseWaveBufferIndex); + channelCount = static_cast(input.channelCount); + + SetWaveBufferIndex(static_cast(input.baseWaveBufferIndex)); } waveBuffers = input.waveBuffers; @@ -49,34 +55,36 @@ namespace skyline::service::audio::IAudioRenderer { if (currentBuffer.size == 0) return; - switch (pcmFormat) { - case skyline::audio::PcmFormat::Int16: - sampleBuffer.resize(currentBuffer.size / sizeof(i16)); - state.process->ReadMemory(sampleBuffer.data(), currentBuffer.address, currentBuffer.size); + switch (format) { + case skyline::audio::AudioFormat::Int16: + samples.resize(currentBuffer.size / sizeof(i16)); + state.process->ReadMemory(samples.data(), currentBuffer.address, currentBuffer.size); break; default: - throw exception("Unsupported voice PCM format: {}", pcmFormat); + throw exception("Unsupported PCM format used by Voice: {}", format); } if (sampleRate != constant::SampleRate) - sampleBuffer = resampler.ResampleBuffer(sampleBuffer, static_cast(sampleRate) / constant::SampleRate, channelCount); + samples = resampler.ResampleBuffer(samples, static_cast(sampleRate) / constant::SampleRate, channelCount); if (channelCount == 1 && constant::ChannelCount != channelCount) { - auto originalSize = sampleBuffer.size(); - sampleBuffer.resize((originalSize / channelCount) * constant::ChannelCount); + auto originalSize = samples.size(); + samples.resize((originalSize / channelCount) * constant::ChannelCount); - for (auto monoIndex = originalSize - 1, targetIndex = sampleBuffer.size(); monoIndex > 0; monoIndex--) + for (auto monoIndex = originalSize - 1, targetIndex = samples.size(); monoIndex > 0; monoIndex--) { + auto sample = samples[monoIndex]; for (auto i = 0; i < constant::ChannelCount; i++) - sampleBuffer[--targetIndex] = sampleBuffer[monoIndex]; + samples[--targetIndex] = sample; + } } } - std::vector &Voice::GetBufferData(int maxSamples, int &outOffset, int &outSize) { + std::vector &Voice::GetBufferData(u32 maxSamples, u32 &outOffset, u32 &outSize) { WaveBuffer ¤tBuffer = waveBuffers.at(bufferIndex); if (!acquired || playbackState != skyline::audio::AudioOutState::Started) { outSize = 0; - return sampleBuffer; + return samples; } if (bufferReload) { @@ -85,28 +93,23 @@ namespace skyline::service::audio::IAudioRenderer { } outOffset = sampleOffset; - outSize = std::min(maxSamples * constant::ChannelCount, static_cast(sampleBuffer.size() - sampleOffset)); + outSize = std::min(maxSamples * constant::ChannelCount, static_cast(samples.size() - sampleOffset)); output.playedSamplesCount += outSize / constant::ChannelCount; sampleOffset += outSize; - if (sampleOffset == sampleBuffer.size()) { + if (sampleOffset == samples.size()) { sampleOffset = 0; if (currentBuffer.lastBuffer) playbackState = skyline::audio::AudioOutState::Paused; if (!currentBuffer.looping) - SetWaveBufferIndex(bufferIndex + 1); + SetWaveBufferIndex(static_cast(bufferIndex + 1)); output.playedWaveBuffersCount++; } - return sampleBuffer; - } - - void Voice::SetWaveBufferIndex(uint index) { - bufferIndex = index & 3; - bufferReload = true; + return samples; } } diff --git a/app/src/main/cpp/skyline/services/audio/IAudioRenderer/voice.h b/app/src/main/cpp/skyline/services/audio/IAudioRenderer/voice.h index c0d99f87..c811f450 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioRenderer/voice.h +++ b/app/src/main/cpp/skyline/services/audio/IAudioRenderer/voice.h @@ -50,7 +50,7 @@ namespace skyline::service::audio::IAudioRenderer { u8 firstUpdate; //!< Whether this voice is new u8 acquired; //!< Whether the sample is in use skyline::audio::AudioOutState playbackState; //!< The playback state - skyline::audio::PcmFormat pcmFormat; //!< The sample format + skyline::audio::AudioFormat format; //!< The sample format u32 sampleRate; //!< The sample rate u32 priority; //!< The priority for this voice u32 _unk0_; @@ -89,20 +89,20 @@ namespace skyline::service::audio::IAudioRenderer { private: const DeviceState &state; //!< The emulator state object std::array waveBuffers; //!< An array containing the state of all four wave buffers - std::vector sampleBuffer; //!< A buffer containing processed sample data + std::vector samples; //!< A vector containing processed sample data skyline::audio::Resampler resampler; //!< The resampler object used for changing the sample rate of a stream bool acquired{false}; //!< If the voice is in use bool bufferReload{true}; //!< If the buffer needs to be updated - uint bufferIndex{}; //!< The index of the wave buffer currently in use - int sampleOffset{}; //!< The offset in the sample data of the current wave buffer - int sampleRate{}; //!< The sample rate of the sample data - int channelCount{}; //!< The amount of channels in the sample data + u8 bufferIndex{}; //!< The index of the wave buffer currently in use + u32 sampleOffset{}; //!< The offset in the sample data of the current wave buffer + u32 sampleRate{}; //!< The sample rate of the sample data + u8 channelCount{}; //!< The amount of channels in the sample data skyline::audio::AudioOutState playbackState{skyline::audio::AudioOutState::Stopped}; //!< The playback state of the voice - skyline::audio::PcmFormat pcmFormat{skyline::audio::PcmFormat::Invalid}; //!< The PCM format used for guest audio data + skyline::audio::AudioFormat format{skyline::audio::AudioFormat::Invalid}; //!< The format used for guest audio data /** - * @brief Updates the sample buffer with data from the current wave buffer and processes it + * @brief This updates the sample buffer with data from the current wave buffer and processes it */ void UpdateBuffers(); @@ -110,7 +110,7 @@ namespace skyline::service::audio::IAudioRenderer { * @brief Sets the current wave buffer index to use * @param index The index to use */ - void SetWaveBufferIndex(uint index); + void SetWaveBufferIndex(u8 index); public: VoiceOut output{}; //!< The current output state @@ -119,20 +119,20 @@ namespace skyline::service::audio::IAudioRenderer { Voice(const DeviceState &state); /** - * @brief Reads the input voice data from the guest and sets internal data based off it + * @brief This reads the input voice data from the guest and sets internal data based off it * @param input The input data struct from guest */ void ProcessInput(const VoiceIn &input); /** - * @brief Obtains the voices audio sample data, updating it if required + * @brief This obtains the voices audio sample data, updating it if required * @param maxSamples The maximum amount of samples the output buffer should contain * @return A vector of I16 PCM sample data */ - std::vector &GetBufferData(int maxSamples, int &outOffset, int &outSize); + std::vector &GetBufferData(u32 maxSamples, u32 &outOffset, u32 &outSize); /** - * @return Whether the voice is currently playable + * @return If the voice is currently playable */ inline bool Playable() { return acquired && playbackState == skyline::audio::AudioOutState::Started && waveBuffers[bufferIndex].size != 0; diff --git a/app/src/main/cpp/skyline/services/audio/IAudioRendererManager.cpp b/app/src/main/cpp/skyline/services/audio/IAudioRendererManager.cpp index 7ee35edc..1744f6f3 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioRendererManager.cpp +++ b/app/src/main/cpp/skyline/services/audio/IAudioRendererManager.cpp @@ -12,7 +12,7 @@ namespace skyline::service::audio { }) {} void IAudioRendererManager::OpenAudioRenderer(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { - IAudioRenderer::AudioRendererParams params = request.Pop(); + IAudioRenderer::AudioRendererParameters params = request.Pop(); state.logger->Debug("IAudioRendererManager: Opening a rev {} IAudioRenderer with sample rate: {}, voice count: {}, effect count: {}", IAudioRenderer::ExtractVersionFromRevision(params.revision), params.sampleRate, params.voiceCount, params.effectCount); @@ -20,34 +20,34 @@ namespace skyline::service::audio { } void IAudioRendererManager::GetAudioRendererWorkBufferSize(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { - IAudioRenderer::AudioRendererParams params = request.Pop(); + IAudioRenderer::AudioRendererParameters params = request.Pop(); IAudioRenderer::RevisionInfo revisionInfo{}; revisionInfo.SetUserRevision(params.revision); u32 totalMixCount = params.subMixCount + 1; - i64 size = utils::AlignUp(params.mixBufferCount * 4, constant::BufferAlignment) + + i64 size = util::AlignUp(params.mixBufferCount * 4, constant::BufferAlignment) + params.subMixCount * 0x400 + totalMixCount * 0x940 + params.voiceCount * 0x3F0 + - utils::AlignUp(totalMixCount * 8, 16) + - utils::AlignUp(params.voiceCount * 8, 16) + - utils::AlignUp(((params.sinkCount + params.subMixCount) * 0x3C0 + params.sampleCount * 4) * (params.mixBufferCount + 6), constant::BufferAlignment) + (params.sinkCount + params.subMixCount) * 0x2C0 + (params.effectCount + params.voiceCount * 4) * 0x30 + 0x50; + util::AlignUp(totalMixCount * 8, 16) + + util::AlignUp(params.voiceCount * 8, 16) + + util::AlignUp(((params.sinkCount + params.subMixCount) * 0x3C0 + params.sampleCount * 4) * (params.mixBufferCount + 6), constant::BufferAlignment) + (params.sinkCount + params.subMixCount) * 0x2C0 + (params.effectCount + params.voiceCount * 4) * 0x30 + 0x50; if (revisionInfo.SplitterSupported()) { - i32 nodeStateWorkSize = utils::AlignUp(totalMixCount, constant::BufferAlignment); + i32 nodeStateWorkSize = util::AlignUp(totalMixCount, constant::BufferAlignment); if (nodeStateWorkSize < 0) nodeStateWorkSize |= 7; nodeStateWorkSize = 4 * (totalMixCount * totalMixCount) + 12 * totalMixCount + 2 * (nodeStateWorkSize / 8); - i32 edgeMatrixWorkSize = utils::AlignUp(totalMixCount * totalMixCount, constant::BufferAlignment); + i32 edgeMatrixWorkSize = util::AlignUp(totalMixCount * totalMixCount, constant::BufferAlignment); if (edgeMatrixWorkSize < 0) edgeMatrixWorkSize |= 7; edgeMatrixWorkSize /= 8; - size += utils::AlignUp(edgeMatrixWorkSize + nodeStateWorkSize, 16); + size += util::AlignUp(edgeMatrixWorkSize + nodeStateWorkSize, 16); } i64 splitterWorkSize = 0; @@ -56,8 +56,9 @@ namespace skyline::service::audio { splitterWorkSize += params.splitterDestinationDataCount * 0xE0 + params.splitterCount * 0x20; if (revisionInfo.SplitterBugFixed()) - splitterWorkSize += utils::AlignUp(4 * params.splitterDestinationDataCount, 16); + splitterWorkSize += util::AlignUp(4 * params.splitterDestinationDataCount, 16); } + size = params.sinkCount * 0x170 + (params.sinkCount + params.subMixCount) * 0x280 + params.effectCount * 0x4C0 + ((size + splitterWorkSize + 0x30 * params.effectCount + (4 * params.voiceCount) + 0x8F) & ~0x3Fl) + ((params.voiceCount << 8) | 0x40); if (params.performanceManagerCount > 0) { @@ -78,7 +79,7 @@ namespace skyline::service::audio { size += 0x1807E; } - size = utils::AlignUp(size, 0x1000); + size = util::AlignUp(size, 0x1000); state.logger->Debug("IAudioRendererManager: Work buffer size: 0x{:X}", size); response.Push(size);