mirror of https://git.suyu.dev/suyu/suyu
Manually tweak source formatting and then re-run clang-format
This commit is contained in:
parent
784b96d87f
commit
396a8d91a4
|
@ -23,7 +23,7 @@ StereoBuffer16 DecodeADPCM(const u8* const data, const size_t sample_count,
|
||||||
|
|
||||||
constexpr size_t FRAME_LEN = 8;
|
constexpr size_t FRAME_LEN = 8;
|
||||||
constexpr size_t SAMPLES_PER_FRAME = 14;
|
constexpr size_t SAMPLES_PER_FRAME = 14;
|
||||||
constexpr std::array<int, 16> SIGNED_NIBBLES{
|
constexpr std::array<int, 16> SIGNED_NIBBLES = {
|
||||||
{0, 1, 2, 3, 4, 5, 6, 7, -8, -7, -6, -5, -4, -3, -2, -1}};
|
{0, 1, 2, 3, 4, 5, 6, 7, -8, -7, -6, -5, -4, -3, -2, -1}};
|
||||||
|
|
||||||
const size_t ret_size =
|
const size_t ret_size =
|
||||||
|
|
|
@ -49,7 +49,8 @@ static SharedMemory& WriteRegion() {
|
||||||
static std::array<Source, num_sources> sources = {
|
static std::array<Source, num_sources> sources = {
|
||||||
Source(0), Source(1), Source(2), Source(3), Source(4), Source(5), Source(6), Source(7),
|
Source(0), Source(1), Source(2), Source(3), Source(4), Source(5), Source(6), Source(7),
|
||||||
Source(8), Source(9), Source(10), Source(11), Source(12), Source(13), Source(14), Source(15),
|
Source(8), Source(9), Source(10), Source(11), Source(12), Source(13), Source(14), Source(15),
|
||||||
Source(16), Source(17), Source(18), Source(19), Source(20), Source(21), Source(22), Source(23)};
|
Source(16), Source(17), Source(18), Source(19), Source(20), Source(21), Source(22), Source(23),
|
||||||
|
};
|
||||||
static Mixers mixers;
|
static Mixers mixers;
|
||||||
|
|
||||||
static StereoFrame16 GenerateCurrentFrame() {
|
static StereoFrame16 GenerateCurrentFrame() {
|
||||||
|
|
|
@ -23,16 +23,15 @@ class Sink;
|
||||||
namespace DSP {
|
namespace DSP {
|
||||||
namespace HLE {
|
namespace HLE {
|
||||||
|
|
||||||
// The application-accessible region of DSP memory consists of two parts.
|
// The application-accessible region of DSP memory consists of two parts. Both are marked as IO and
|
||||||
// Both are marked as IO and have Read/Write permissions.
|
// have Read/Write permissions.
|
||||||
//
|
//
|
||||||
// First Region: 0x1FF50000 (Size: 0x8000)
|
// First Region: 0x1FF50000 (Size: 0x8000)
|
||||||
// Second Region: 0x1FF70000 (Size: 0x8000)
|
// Second Region: 0x1FF70000 (Size: 0x8000)
|
||||||
//
|
//
|
||||||
// The DSP reads from each region alternately based on the frame counter for each region much like a
|
// The DSP reads from each region alternately based on the frame counter for each region much like a
|
||||||
// double-buffer. The frame counter is located as the very last u16 of each region and is
|
// double-buffer. The frame counter is located as the very last u16 of each region and is
|
||||||
// incremented
|
// incremented each audio tick.
|
||||||
// each audio tick.
|
|
||||||
|
|
||||||
constexpr VAddr region0_base = 0x1FF50000;
|
constexpr VAddr region0_base = 0x1FF50000;
|
||||||
constexpr VAddr region1_base = 0x1FF70000;
|
constexpr VAddr region1_base = 0x1FF70000;
|
||||||
|
@ -92,14 +91,12 @@ static_assert(std::is_trivially_copyable<u32_dsp>::value, "u32_dsp isn't trivial
|
||||||
// See also: DSP::HLE::PipeRead.
|
// See also: DSP::HLE::PipeRead.
|
||||||
//
|
//
|
||||||
// Note that the above addresses do vary slightly between audio firmwares observed; the addresses
|
// Note that the above addresses do vary slightly between audio firmwares observed; the addresses
|
||||||
// are
|
// are not fixed in stone. The addresses above are only an examplar; they're what this
|
||||||
// not fixed in stone. The addresses above are only an examplar; they're what this implementation
|
// implementation does and provides to applications.
|
||||||
// does and provides to applications.
|
|
||||||
//
|
//
|
||||||
// Application requests the DSP service to convert DSP addresses into ARM11 virtual addresses using
|
// Application requests the DSP service to convert DSP addresses into ARM11 virtual addresses using
|
||||||
// the
|
// the ConvertProcessAddressFromDspDram service call. Applications seem to derive the addresses for
|
||||||
// ConvertProcessAddressFromDspDram service call. Applications seem to derive the addresses for the
|
// the second region via:
|
||||||
// second region via:
|
|
||||||
// second_region_dsp_addr = first_region_dsp_addr | 0x10000
|
// second_region_dsp_addr = first_region_dsp_addr | 0x10000
|
||||||
//
|
//
|
||||||
// Applications maintain most of its own audio state, the memory region is used mainly for
|
// Applications maintain most of its own audio state, the memory region is used mainly for
|
||||||
|
@ -107,7 +104,7 @@ static_assert(std::is_trivially_copyable<u32_dsp>::value, "u32_dsp isn't trivial
|
||||||
//
|
//
|
||||||
// In the documentation below, filter and effect transfer functions are specified in the z domain.
|
// In the documentation below, filter and effect transfer functions are specified in the z domain.
|
||||||
// (If you are more familiar with the Laplace transform, z = exp(sT). The z domain is the digital
|
// (If you are more familiar with the Laplace transform, z = exp(sT). The z domain is the digital
|
||||||
// frequency domain, just like how the s domain is the analog frequency domain.)
|
// frequency domain, just like how the s domain is the analog frequency domain.)
|
||||||
|
|
||||||
#define INSERT_PADDING_DSPWORDS(num_words) INSERT_PADDING_BYTES(2 * (num_words))
|
#define INSERT_PADDING_DSPWORDS(num_words) INSERT_PADDING_BYTES(2 * (num_words))
|
||||||
|
|
||||||
|
@ -137,8 +134,8 @@ struct SourceConfiguration {
|
||||||
BitField<0, 1, u32_le> format_dirty;
|
BitField<0, 1, u32_le> format_dirty;
|
||||||
BitField<1, 1, u32_le> mono_or_stereo_dirty;
|
BitField<1, 1, u32_le> mono_or_stereo_dirty;
|
||||||
BitField<2, 1, u32_le> adpcm_coefficients_dirty;
|
BitField<2, 1, u32_le> adpcm_coefficients_dirty;
|
||||||
BitField<3, 1, u32_le>
|
/// Tends to be set when a looped buffer is queued.
|
||||||
partial_embedded_buffer_dirty; ///< Tends to be set when a looped buffer is queued.
|
BitField<3, 1, u32_le> partial_embedded_buffer_dirty;
|
||||||
BitField<4, 1, u32_le> partial_reset_flag;
|
BitField<4, 1, u32_le> partial_reset_flag;
|
||||||
|
|
||||||
BitField<16, 1, u32_le> enable_dirty;
|
BitField<16, 1, u32_le> enable_dirty;
|
||||||
|
@ -146,8 +143,8 @@ struct SourceConfiguration {
|
||||||
BitField<18, 1, u32_le> rate_multiplier_dirty;
|
BitField<18, 1, u32_le> rate_multiplier_dirty;
|
||||||
BitField<19, 1, u32_le> buffer_queue_dirty;
|
BitField<19, 1, u32_le> buffer_queue_dirty;
|
||||||
BitField<20, 1, u32_le> loop_related_dirty;
|
BitField<20, 1, u32_le> loop_related_dirty;
|
||||||
BitField<21, 1, u32_le>
|
/// Tends to also be set when embedded buffer is updated.
|
||||||
play_position_dirty; ///< Tends to also be set when embedded buffer is updated.
|
BitField<21, 1, u32_le> play_position_dirty;
|
||||||
BitField<22, 1, u32_le> filters_enabled_dirty;
|
BitField<22, 1, u32_le> filters_enabled_dirty;
|
||||||
BitField<23, 1, u32_le> simple_filter_dirty;
|
BitField<23, 1, u32_le> simple_filter_dirty;
|
||||||
BitField<24, 1, u32_le> biquad_filter_dirty;
|
BitField<24, 1, u32_le> biquad_filter_dirty;
|
||||||
|
@ -162,9 +159,9 @@ struct SourceConfiguration {
|
||||||
// Gain control
|
// Gain control
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gain is between 0.0-1.0. This determines how much will this source appear on
|
* Gain is between 0.0-1.0. This determines how much will this source appear on each of the
|
||||||
* each of the 12 channels that feed into the intermediate mixers.
|
* 12 channels that feed into the intermediate mixers. Each of the three intermediate mixers
|
||||||
* Each of the three intermediate mixers is fed two left and two right channels.
|
* is fed two left and two right channels.
|
||||||
*/
|
*/
|
||||||
float_le gain[3][4];
|
float_le gain[3][4];
|
||||||
|
|
||||||
|
@ -173,7 +170,11 @@ struct SourceConfiguration {
|
||||||
/// Multiplier for sample rate. Resampling occurs with the selected interpolation method.
|
/// Multiplier for sample rate. Resampling occurs with the selected interpolation method.
|
||||||
float_le rate_multiplier;
|
float_le rate_multiplier;
|
||||||
|
|
||||||
enum class InterpolationMode : u8 { Polyphase = 0, Linear = 1, None = 2 };
|
enum class InterpolationMode : u8 {
|
||||||
|
Polyphase = 0,
|
||||||
|
Linear = 1,
|
||||||
|
None = 2,
|
||||||
|
};
|
||||||
|
|
||||||
InterpolationMode interpolation_mode;
|
InterpolationMode interpolation_mode;
|
||||||
INSERT_PADDING_BYTES(1); ///< Interpolation related
|
INSERT_PADDING_BYTES(1); ///< Interpolation related
|
||||||
|
@ -197,8 +198,7 @@ struct SourceConfiguration {
|
||||||
* The transfer function of this filter is:
|
* The transfer function of this filter is:
|
||||||
* H(z) = (b0 + b1 z^-1 + b2 z^-2) / (1 - a1 z^-1 - a2 z^-2)
|
* H(z) = (b0 + b1 z^-1 + b2 z^-2) / (1 - a1 z^-1 - a2 z^-2)
|
||||||
* Nintendo chose to negate the feedbackward coefficients. This differs from standard
|
* Nintendo chose to negate the feedbackward coefficients. This differs from standard
|
||||||
* notation
|
* notation as in: https://ccrma.stanford.edu/~jos/filters/Direct_Form_I.html
|
||||||
* as in: https://ccrma.stanford.edu/~jos/filters/Direct_Form_I.html
|
|
||||||
* Values are signed fixed point with 14 fractional bits.
|
* Values are signed fixed point with 14 fractional bits.
|
||||||
*/
|
*/
|
||||||
struct BiquadFilter {
|
struct BiquadFilter {
|
||||||
|
@ -246,8 +246,8 @@ struct SourceConfiguration {
|
||||||
u8 is_looping;
|
u8 is_looping;
|
||||||
|
|
||||||
/// This value is shown in SourceStatus::previous_buffer_id when this buffer has
|
/// This value is shown in SourceStatus::previous_buffer_id when this buffer has
|
||||||
/// finished.
|
/// finished. This allows the emulated application to tell what buffer is currently
|
||||||
/// This allows the emulated application to tell what buffer is currently playing
|
/// playing.
|
||||||
u16_le buffer_id;
|
u16_le buffer_id;
|
||||||
|
|
||||||
INSERT_PADDING_DSPWORDS(1);
|
INSERT_PADDING_DSPWORDS(1);
|
||||||
|
@ -275,9 +275,16 @@ struct SourceConfiguration {
|
||||||
/// Note a sample takes up different number of bytes in different buffer formats.
|
/// Note a sample takes up different number of bytes in different buffer formats.
|
||||||
u32_dsp length;
|
u32_dsp length;
|
||||||
|
|
||||||
enum class MonoOrStereo : u16_le { Mono = 1, Stereo = 2 };
|
enum class MonoOrStereo : u16_le {
|
||||||
|
Mono = 1,
|
||||||
|
Stereo = 2,
|
||||||
|
};
|
||||||
|
|
||||||
enum class Format : u16_le { PCM8 = 0, PCM16 = 1, ADPCM = 2 };
|
enum class Format : u16_le {
|
||||||
|
PCM8 = 0,
|
||||||
|
PCM16 = 1,
|
||||||
|
ADPCM = 2,
|
||||||
|
};
|
||||||
|
|
||||||
union {
|
union {
|
||||||
u16_le flags1_raw;
|
u16_le flags1_raw;
|
||||||
|
@ -349,12 +356,16 @@ struct DspConfiguration {
|
||||||
};
|
};
|
||||||
|
|
||||||
/// The DSP has three intermediate audio mixers. This controls the volume level (0.0-1.0) for
|
/// The DSP has three intermediate audio mixers. This controls the volume level (0.0-1.0) for
|
||||||
/// each at the final mixer
|
/// each at the final mixer.
|
||||||
float_le volume[3];
|
float_le volume[3];
|
||||||
|
|
||||||
INSERT_PADDING_DSPWORDS(3);
|
INSERT_PADDING_DSPWORDS(3);
|
||||||
|
|
||||||
enum class OutputFormat : u16_le { Mono = 0, Stereo = 1, Surround = 2 };
|
enum class OutputFormat : u16_le {
|
||||||
|
Mono = 0,
|
||||||
|
Stereo = 1,
|
||||||
|
Surround = 2,
|
||||||
|
};
|
||||||
|
|
||||||
OutputFormat output_format;
|
OutputFormat output_format;
|
||||||
|
|
||||||
|
@ -386,9 +397,10 @@ struct DspConfiguration {
|
||||||
u16_le enable;
|
u16_le enable;
|
||||||
INSERT_PADDING_DSPWORDS(1);
|
INSERT_PADDING_DSPWORDS(1);
|
||||||
u16_le outputs;
|
u16_le outputs;
|
||||||
u32_dsp work_buffer_address; ///< The application allocates a block of memory for the DSP to
|
/// The application allocates a block of memory for the DSP to use as a work buffer.
|
||||||
/// use as a work buffer.
|
u32_dsp work_buffer_address;
|
||||||
u16_le frame_count; ///< Frames to delay by
|
/// Frames to delay by
|
||||||
|
u16_le frame_count;
|
||||||
|
|
||||||
// Coefficients
|
// Coefficients
|
||||||
s16_le g; ///< Fixed point with 7 fractional bits
|
s16_le g; ///< Fixed point with 7 fractional bits
|
||||||
|
|
|
@ -61,6 +61,7 @@ void SourceFilters::SimpleFilter::Reset() {
|
||||||
|
|
||||||
void SourceFilters::SimpleFilter::Configure(
|
void SourceFilters::SimpleFilter::Configure(
|
||||||
SourceConfiguration::Configuration::SimpleFilter config) {
|
SourceConfiguration::Configuration::SimpleFilter config) {
|
||||||
|
|
||||||
a1 = config.a1;
|
a1 = config.a1;
|
||||||
b0 = config.b0;
|
b0 = config.b0;
|
||||||
}
|
}
|
||||||
|
@ -91,6 +92,7 @@ void SourceFilters::BiquadFilter::Reset() {
|
||||||
|
|
||||||
void SourceFilters::BiquadFilter::Configure(
|
void SourceFilters::BiquadFilter::Configure(
|
||||||
SourceConfiguration::Configuration::BiquadFilter config) {
|
SourceConfiguration::Configuration::BiquadFilter config) {
|
||||||
|
|
||||||
a1 = config.a1;
|
a1 = config.a1;
|
||||||
a2 = config.a2;
|
a2 = config.a2;
|
||||||
b0 = config.b0;
|
b0 = config.b0;
|
||||||
|
|
|
@ -77,9 +77,8 @@ void Mixers::ParseConfig(DspConfiguration& config) {
|
||||||
|
|
||||||
if (config.headphones_connected_dirty) {
|
if (config.headphones_connected_dirty) {
|
||||||
config.headphones_connected_dirty.Assign(0);
|
config.headphones_connected_dirty.Assign(0);
|
||||||
// Do nothing.
|
// Do nothing. (Note: Whether headphones are connected does affect coefficients used for
|
||||||
// (Note: Whether headphones are connected does affect coefficients used for surround
|
// surround sound.)
|
||||||
// sound.)
|
|
||||||
LOG_TRACE(Audio_DSP, "mixers headphones_connected=%hu", config.headphones_connected);
|
LOG_TRACE(Audio_DSP, "mixers headphones_connected=%hu", config.headphones_connected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,8 @@ static void AudioPipeWriteStructAddresses() {
|
||||||
0x8000 + offsetof(SharedMemory, unknown11) / 2,
|
0x8000 + offsetof(SharedMemory, unknown11) / 2,
|
||||||
0x8000 + offsetof(SharedMemory, unknown12) / 2,
|
0x8000 + offsetof(SharedMemory, unknown12) / 2,
|
||||||
0x8000 + offsetof(SharedMemory, unknown13) / 2,
|
0x8000 + offsetof(SharedMemory, unknown13) / 2,
|
||||||
0x8000 + offsetof(SharedMemory, unknown14) / 2};
|
0x8000 + offsetof(SharedMemory, unknown14) / 2,
|
||||||
|
};
|
||||||
|
|
||||||
// Begin with a u16 denoting the number of structs.
|
// Begin with a u16 denoting the number of structs.
|
||||||
WriteU16(DspPipe::Audio, static_cast<u16>(struct_addresses.size()));
|
WriteU16(DspPipe::Audio, static_cast<u16>(struct_addresses.size()));
|
||||||
|
@ -118,7 +119,12 @@ void PipeWrite(DspPipe pipe_number, const std::vector<u8>& buffer) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class StateChange { Initalize = 0, Shutdown = 1, Wakeup = 2, Sleep = 3 };
|
enum class StateChange {
|
||||||
|
Initalize = 0,
|
||||||
|
Shutdown = 1,
|
||||||
|
Wakeup = 2,
|
||||||
|
Sleep = 3,
|
||||||
|
};
|
||||||
|
|
||||||
// The difference between Initialize and Wakeup is that Input state is maintained
|
// The difference between Initialize and Wakeup is that Input state is maintained
|
||||||
// when sleeping but isn't when turning it off and on again. (TODO: Implement this.)
|
// when sleeping but isn't when turning it off and on again. (TODO: Implement this.)
|
||||||
|
|
|
@ -15,7 +15,12 @@ namespace HLE {
|
||||||
/// Reset the pipes by setting pipe positions back to the beginning.
|
/// Reset the pipes by setting pipe positions back to the beginning.
|
||||||
void ResetPipes();
|
void ResetPipes();
|
||||||
|
|
||||||
enum class DspPipe { Debug = 0, Dma = 1, Audio = 2, Binary = 3 };
|
enum class DspPipe {
|
||||||
|
Debug = 0,
|
||||||
|
Dma = 1,
|
||||||
|
Audio = 2,
|
||||||
|
Binary = 3,
|
||||||
|
};
|
||||||
constexpr size_t NUM_DSP_PIPE = 8;
|
constexpr size_t NUM_DSP_PIPE = 8;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -46,7 +51,12 @@ size_t GetPipeReadableSize(DspPipe pipe_number);
|
||||||
*/
|
*/
|
||||||
void PipeWrite(DspPipe pipe_number, const std::vector<u8>& buffer);
|
void PipeWrite(DspPipe pipe_number, const std::vector<u8>& buffer);
|
||||||
|
|
||||||
enum class DspState { Off, On, Sleeping };
|
enum class DspState {
|
||||||
|
Off,
|
||||||
|
On,
|
||||||
|
Sleeping,
|
||||||
|
};
|
||||||
|
|
||||||
/// Get the state of the DSP
|
/// Get the state of the DSP
|
||||||
DspState GetDspState();
|
DspState GetDspState();
|
||||||
|
|
||||||
|
|
|
@ -163,16 +163,18 @@ void Source::ParseConfig(SourceConfiguration::Configuration& config,
|
||||||
|
|
||||||
if (config.embedded_buffer_dirty) {
|
if (config.embedded_buffer_dirty) {
|
||||||
config.embedded_buffer_dirty.Assign(0);
|
config.embedded_buffer_dirty.Assign(0);
|
||||||
state.input_queue.emplace(Buffer{config.physical_address,
|
state.input_queue.emplace(Buffer{
|
||||||
config.length,
|
config.physical_address,
|
||||||
static_cast<u8>(config.adpcm_ps),
|
config.length,
|
||||||
{config.adpcm_yn[0], config.adpcm_yn[1]},
|
static_cast<u8>(config.adpcm_ps),
|
||||||
config.adpcm_dirty.ToBool(),
|
{config.adpcm_yn[0], config.adpcm_yn[1]},
|
||||||
config.is_looping.ToBool(),
|
config.adpcm_dirty.ToBool(),
|
||||||
config.buffer_id,
|
config.is_looping.ToBool(),
|
||||||
state.mono_or_stereo,
|
config.buffer_id,
|
||||||
state.format,
|
state.mono_or_stereo,
|
||||||
false});
|
state.format,
|
||||||
|
false,
|
||||||
|
});
|
||||||
LOG_TRACE(Audio_DSP, "enqueuing embedded addr=0x%08x len=%u id=%hu",
|
LOG_TRACE(Audio_DSP, "enqueuing embedded addr=0x%08x len=%u id=%hu",
|
||||||
config.physical_address, config.length, config.buffer_id);
|
config.physical_address, config.length, config.buffer_id);
|
||||||
}
|
}
|
||||||
|
@ -182,16 +184,18 @@ void Source::ParseConfig(SourceConfiguration::Configuration& config,
|
||||||
for (size_t i = 0; i < 4; i++) {
|
for (size_t i = 0; i < 4; i++) {
|
||||||
if (config.buffers_dirty & (1 << i)) {
|
if (config.buffers_dirty & (1 << i)) {
|
||||||
const auto& b = config.buffers[i];
|
const auto& b = config.buffers[i];
|
||||||
state.input_queue.emplace(Buffer{b.physical_address,
|
state.input_queue.emplace(Buffer{
|
||||||
b.length,
|
b.physical_address,
|
||||||
static_cast<u8>(b.adpcm_ps),
|
b.length,
|
||||||
{b.adpcm_yn[0], b.adpcm_yn[1]},
|
static_cast<u8>(b.adpcm_ps),
|
||||||
b.adpcm_dirty != 0,
|
{b.adpcm_yn[0], b.adpcm_yn[1]},
|
||||||
b.is_looping != 0,
|
b.adpcm_dirty != 0,
|
||||||
b.buffer_id,
|
b.is_looping != 0,
|
||||||
state.mono_or_stereo,
|
b.buffer_id,
|
||||||
state.format,
|
state.mono_or_stereo,
|
||||||
true});
|
state.format,
|
||||||
|
true,
|
||||||
|
});
|
||||||
LOG_TRACE(Audio_DSP, "enqueuing queued %zu addr=0x%08x len=%u id=%hu", i,
|
LOG_TRACE(Audio_DSP, "enqueuing queued %zu addr=0x%08x len=%u id=%hu", i,
|
||||||
b.physical_address, b.length, b.buffer_id);
|
b.physical_address, b.length, b.buffer_id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,15 +71,17 @@ StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multip
|
||||||
|
|
||||||
StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier) {
|
StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier) {
|
||||||
// Note on accuracy: Some values that this produces are +/- 1 from the actual firmware.
|
// Note on accuracy: Some values that this produces are +/- 1 from the actual firmware.
|
||||||
return StepOverSamples(state, input, rate_multiplier, [](u64 fraction, const auto& x0,
|
return StepOverSamples(state, input, rate_multiplier,
|
||||||
const auto& x1, const auto& x2) {
|
[](u64 fraction, const auto& x0, const auto& x1, const auto& x2) {
|
||||||
// This is a saturated subtraction. (Verified by black-box fuzzing.)
|
// This is a saturated subtraction. (Verified by black-box fuzzing.)
|
||||||
s64 delta0 = MathUtil::Clamp<s64>(x1[0] - x0[0], -32768, 32767);
|
s64 delta0 = MathUtil::Clamp<s64>(x1[0] - x0[0], -32768, 32767);
|
||||||
s64 delta1 = MathUtil::Clamp<s64>(x1[1] - x0[1], -32768, 32767);
|
s64 delta1 = MathUtil::Clamp<s64>(x1[1] - x0[1], -32768, 32767);
|
||||||
|
|
||||||
return std::array<s16, 2>{static_cast<s16>(x0[0] + fraction * delta0 / scale_factor),
|
return std::array<s16, 2>{
|
||||||
static_cast<s16>(x0[1] + fraction * delta1 / scale_factor)};
|
static_cast<s16>(x0[0] + fraction * delta0 / scale_factor),
|
||||||
});
|
static_cast<s16>(x0[1] + fraction * delta1 / scale_factor),
|
||||||
|
};
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace AudioInterp
|
} // namespace AudioInterp
|
||||||
|
|
|
@ -25,7 +25,7 @@ struct State {
|
||||||
* @param input Input buffer.
|
* @param input Input buffer.
|
||||||
* @param rate_multiplier Stretch factor. Must be a positive non-zero value.
|
* @param rate_multiplier Stretch factor. Must be a positive non-zero value.
|
||||||
* rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0
|
* rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0
|
||||||
* performs upsampling.
|
* performs upsampling.
|
||||||
* @return The resampled audio buffer.
|
* @return The resampled audio buffer.
|
||||||
*/
|
*/
|
||||||
StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multiplier);
|
StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multiplier);
|
||||||
|
@ -35,7 +35,7 @@ StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multip
|
||||||
* @param input Input buffer.
|
* @param input Input buffer.
|
||||||
* @param rate_multiplier Stretch factor. Must be a positive non-zero value.
|
* @param rate_multiplier Stretch factor. Must be a positive non-zero value.
|
||||||
* rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0
|
* rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0
|
||||||
* performs upsampling.
|
* performs upsampling.
|
||||||
* @return The resampled audio buffer.
|
* @return The resampled audio buffer.
|
||||||
*/
|
*/
|
||||||
StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier);
|
StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier);
|
||||||
|
|
|
@ -19,8 +19,7 @@ public:
|
||||||
return native_sample_rate;
|
return native_sample_rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnqueueSamples(const s16*, size_t) override {
|
void EnqueueSamples(const s16*, size_t) override {}
|
||||||
}
|
|
||||||
|
|
||||||
size_t SamplesInQueue() const override {
|
size_t SamplesInQueue() const override {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -12,8 +12,8 @@ namespace AudioCore {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is an interface for an audio sink. An audio sink accepts samples in stereo signed
|
* This class is an interface for an audio sink. An audio sink accepts samples in stereo signed
|
||||||
* PCM16 format to be output.
|
* PCM16 format to be output. Sinks *do not* handle resampling and expect the correct sample rate.
|
||||||
* Sinks *do not* handle resampling and expect the correct sample rate. They are dumb outputs.
|
* They are dumb outputs.
|
||||||
*/
|
*/
|
||||||
class Sink {
|
class Sink {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -14,8 +14,7 @@ class Sink;
|
||||||
|
|
||||||
struct SinkDetails {
|
struct SinkDetails {
|
||||||
SinkDetails(const char* id_, std::function<std::unique_ptr<Sink>()> factory_)
|
SinkDetails(const char* id_, std::function<std::unique_ptr<Sink>()> factory_)
|
||||||
: id(id_), factory(factory_) {
|
: id(id_), factory(factory_) {}
|
||||||
}
|
|
||||||
|
|
||||||
/// Name for this sink.
|
/// Name for this sink.
|
||||||
const char* id;
|
const char* id;
|
||||||
|
|
|
@ -69,10 +69,12 @@ int main(int argc, char** argv) {
|
||||||
#endif
|
#endif
|
||||||
std::string boot_filename;
|
std::string boot_filename;
|
||||||
|
|
||||||
static struct option long_options[] = {{"gdbport", required_argument, 0, 'g'},
|
static struct option long_options[] = {
|
||||||
{"help", no_argument, 0, 'h'},
|
{"gdbport", required_argument, 0, 'g'},
|
||||||
{"version", no_argument, 0, 'v'},
|
{"help", no_argument, 0, 'h'},
|
||||||
{0, 0, 0, 0}};
|
{"version", no_argument, 0, 'v'},
|
||||||
|
{0, 0, 0, 0},
|
||||||
|
};
|
||||||
|
|
||||||
while (optind < argc) {
|
while (optind < argc) {
|
||||||
char arg = getopt_long(argc, argv, "g:hv", long_options, &option_index);
|
char arg = getopt_long(argc, argv, "g:hv", long_options, &option_index);
|
||||||
|
|
|
@ -181,5 +181,6 @@ void EmuWindow_SDL2::ReloadSetKeymaps() {
|
||||||
|
|
||||||
void EmuWindow_SDL2::OnMinimalClientAreaChangeRequest(
|
void EmuWindow_SDL2::OnMinimalClientAreaChangeRequest(
|
||||||
const std::pair<unsigned, unsigned>& minimal_size) {
|
const std::pair<unsigned, unsigned>& minimal_size) {
|
||||||
|
|
||||||
SDL_SetWindowMinimumSize(render_window, minimal_size.first, minimal_size.second);
|
SDL_SetWindowMinimumSize(render_window, minimal_size.first, minimal_size.second);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,8 +47,8 @@ private:
|
||||||
void OnResize();
|
void OnResize();
|
||||||
|
|
||||||
/// Called when a configuration change affects the minimal size of the window
|
/// Called when a configuration change affects the minimal size of the window
|
||||||
void
|
void OnMinimalClientAreaChangeRequest(
|
||||||
OnMinimalClientAreaChangeRequest(const std::pair<unsigned, unsigned>& minimal_size) override;
|
const std::pair<unsigned, unsigned>& minimal_size) override;
|
||||||
|
|
||||||
/// Is the window still open?
|
/// Is the window still open?
|
||||||
bool is_open = true;
|
bool is_open = true;
|
||||||
|
|
|
@ -28,8 +28,7 @@
|
||||||
#define COPYRIGHT "Copyright (C) 2013-2014 Citra Team"
|
#define COPYRIGHT "Copyright (C) 2013-2014 Citra Team"
|
||||||
|
|
||||||
EmuThread::EmuThread(GRenderWindow* render_window)
|
EmuThread::EmuThread(GRenderWindow* render_window)
|
||||||
: exec_step(false), running(false), stop_run(false), render_window(render_window) {
|
: exec_step(false), running(false), stop_run(false), render_window(render_window) {}
|
||||||
}
|
|
||||||
|
|
||||||
void EmuThread::run() {
|
void EmuThread::run() {
|
||||||
render_window->MakeCurrent();
|
render_window->MakeCurrent();
|
||||||
|
@ -84,8 +83,7 @@ void EmuThread::run() {
|
||||||
class GGLWidgetInternal : public QGLWidget {
|
class GGLWidgetInternal : public QGLWidget {
|
||||||
public:
|
public:
|
||||||
GGLWidgetInternal(QGLFormat fmt, GRenderWindow* parent)
|
GGLWidgetInternal(QGLFormat fmt, GRenderWindow* parent)
|
||||||
: QGLWidget(fmt, parent), parent(parent) {
|
: QGLWidget(fmt, parent), parent(parent) {}
|
||||||
}
|
|
||||||
|
|
||||||
void paintEvent(QPaintEvent* ev) override {
|
void paintEvent(QPaintEvent* ev) override {
|
||||||
if (do_painting) {
|
if (do_painting) {
|
||||||
|
@ -153,8 +151,7 @@ void GRenderWindow::DoneCurrent() {
|
||||||
child->doneCurrent();
|
child->doneCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GRenderWindow::PollEvents() {
|
void GRenderWindow::PollEvents() {}
|
||||||
}
|
|
||||||
|
|
||||||
// On Qt 5.0+, this correctly gets the size of the framebuffer (pixels).
|
// On Qt 5.0+, this correctly gets the size of the framebuffer (pixels).
|
||||||
//
|
//
|
||||||
|
@ -306,8 +303,8 @@ void GRenderWindow::OnEmulationStopping() {
|
||||||
void GRenderWindow::showEvent(QShowEvent* event) {
|
void GRenderWindow::showEvent(QShowEvent* event) {
|
||||||
QWidget::showEvent(event);
|
QWidget::showEvent(event);
|
||||||
|
|
||||||
// windowHandle() is not initialized until the Window is shown, so we connect it here.
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
||||||
|
// windowHandle() is not initialized until the Window is shown, so we connect it here.
|
||||||
connect(this->windowHandle(), SIGNAL(screenChanged(QScreen*)), this,
|
connect(this->windowHandle(), SIGNAL(screenChanged(QScreen*)), this,
|
||||||
SLOT(OnFramebufferSizeChanged()), Qt::UniqueConnection);
|
SLOT(OnFramebufferSizeChanged()), Qt::UniqueConnection);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -144,8 +144,8 @@ signals:
|
||||||
void Closed();
|
void Closed();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void
|
void OnMinimalClientAreaChangeRequest(
|
||||||
OnMinimalClientAreaChangeRequest(const std::pair<unsigned, unsigned>& minimal_size) override;
|
const std::pair<unsigned, unsigned>& minimal_size) override;
|
||||||
|
|
||||||
GGLWidgetInternal* child;
|
GGLWidgetInternal* child;
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,7 @@ ConfigureAudio::ConfigureAudio(QWidget* parent)
|
||||||
this->setConfiguration();
|
this->setConfiguration();
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigureAudio::~ConfigureAudio() {
|
ConfigureAudio::~ConfigureAudio() {}
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigureAudio::setConfiguration() {
|
void ConfigureAudio::setConfiguration() {
|
||||||
int new_sink_index = 0;
|
int new_sink_index = 0;
|
||||||
|
|
|
@ -12,8 +12,7 @@ ConfigureDebug::ConfigureDebug(QWidget* parent) : QWidget(parent), ui(new Ui::Co
|
||||||
this->setConfiguration();
|
this->setConfiguration();
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigureDebug::~ConfigureDebug() {
|
ConfigureDebug::~ConfigureDebug() {}
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigureDebug::setConfiguration() {
|
void ConfigureDebug::setConfiguration() {
|
||||||
ui->toggle_gdbstub->setChecked(Settings::values.use_gdbstub);
|
ui->toggle_gdbstub->setChecked(Settings::values.use_gdbstub);
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "citra_qt/config.h"
|
|
||||||
#include "citra_qt/configure_dialog.h"
|
#include "citra_qt/configure_dialog.h"
|
||||||
|
#include "citra_qt/config.h"
|
||||||
#include "ui_configure.h"
|
#include "ui_configure.h"
|
||||||
|
|
||||||
#include "core/settings.h"
|
#include "core/settings.h"
|
||||||
|
@ -13,11 +13,9 @@ ConfigureDialog::ConfigureDialog(QWidget* parent) : QDialog(parent), ui(new Ui::
|
||||||
this->setConfiguration();
|
this->setConfiguration();
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigureDialog::~ConfigureDialog() {
|
ConfigureDialog::~ConfigureDialog() {}
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigureDialog::setConfiguration() {
|
void ConfigureDialog::setConfiguration() {}
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigureDialog::applyConfiguration() {
|
void ConfigureDialog::applyConfiguration() {
|
||||||
ui->generalTab->applyConfiguration();
|
ui->generalTab->applyConfiguration();
|
||||||
|
|
|
@ -11,14 +11,14 @@
|
||||||
|
|
||||||
ConfigureGeneral::ConfigureGeneral(QWidget* parent)
|
ConfigureGeneral::ConfigureGeneral(QWidget* parent)
|
||||||
: QWidget(parent), ui(new Ui::ConfigureGeneral) {
|
: QWidget(parent), ui(new Ui::ConfigureGeneral) {
|
||||||
|
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
this->setConfiguration();
|
this->setConfiguration();
|
||||||
|
|
||||||
ui->toggle_cpu_jit->setEnabled(!System::IsPoweredOn());
|
ui->toggle_cpu_jit->setEnabled(!System::IsPoweredOn());
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigureGeneral::~ConfigureGeneral() {
|
ConfigureGeneral::~ConfigureGeneral() {}
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigureGeneral::setConfiguration() {
|
void ConfigureGeneral::setConfiguration() {
|
||||||
ui->toggle_deepscan->setChecked(UISettings::values.gamedir_deepscan);
|
ui->toggle_deepscan->setChecked(UISettings::values.gamedir_deepscan);
|
||||||
|
|
|
@ -10,14 +10,14 @@
|
||||||
|
|
||||||
ConfigureGraphics::ConfigureGraphics(QWidget* parent)
|
ConfigureGraphics::ConfigureGraphics(QWidget* parent)
|
||||||
: QWidget(parent), ui(new Ui::ConfigureGraphics) {
|
: QWidget(parent), ui(new Ui::ConfigureGraphics) {
|
||||||
|
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
this->setConfiguration();
|
this->setConfiguration();
|
||||||
|
|
||||||
ui->toggle_vsync->setEnabled(!System::IsPoweredOn());
|
ui->toggle_vsync->setEnabled(!System::IsPoweredOn());
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigureGraphics::~ConfigureGraphics() {
|
ConfigureGraphics::~ConfigureGraphics() {}
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigureGraphics::setConfiguration() {
|
void ConfigureGraphics::setConfiguration() {
|
||||||
ui->toggle_hw_renderer->setChecked(Settings::values.use_hw_renderer);
|
ui->toggle_hw_renderer->setChecked(Settings::values.use_hw_renderer);
|
||||||
|
|
|
@ -10,34 +10,35 @@
|
||||||
|
|
||||||
ConfigureInput::ConfigureInput(QWidget* parent)
|
ConfigureInput::ConfigureInput(QWidget* parent)
|
||||||
: QWidget(parent), ui(std::make_unique<Ui::ConfigureInput>()) {
|
: QWidget(parent), ui(std::make_unique<Ui::ConfigureInput>()) {
|
||||||
|
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
// Initialize mapping of input enum to UI button.
|
// Initialize mapping of input enum to UI button.
|
||||||
input_mapping = {
|
input_mapping = {
|
||||||
{std::make_pair(Settings::NativeInput::Values::A, ui->buttonA)},
|
{Settings::NativeInput::Values::A, ui->buttonA},
|
||||||
{std::make_pair(Settings::NativeInput::Values::B, ui->buttonB)},
|
{Settings::NativeInput::Values::B, ui->buttonB},
|
||||||
{std::make_pair(Settings::NativeInput::Values::X, ui->buttonX)},
|
{Settings::NativeInput::Values::X, ui->buttonX},
|
||||||
{std::make_pair(Settings::NativeInput::Values::Y, ui->buttonY)},
|
{Settings::NativeInput::Values::Y, ui->buttonY},
|
||||||
{std::make_pair(Settings::NativeInput::Values::L, ui->buttonL)},
|
{Settings::NativeInput::Values::L, ui->buttonL},
|
||||||
{std::make_pair(Settings::NativeInput::Values::R, ui->buttonR)},
|
{Settings::NativeInput::Values::R, ui->buttonR},
|
||||||
{std::make_pair(Settings::NativeInput::Values::ZL, ui->buttonZL)},
|
{Settings::NativeInput::Values::ZL, ui->buttonZL},
|
||||||
{std::make_pair(Settings::NativeInput::Values::ZR, ui->buttonZR)},
|
{Settings::NativeInput::Values::ZR, ui->buttonZR},
|
||||||
{std::make_pair(Settings::NativeInput::Values::START, ui->buttonStart)},
|
{Settings::NativeInput::Values::START, ui->buttonStart},
|
||||||
{std::make_pair(Settings::NativeInput::Values::SELECT, ui->buttonSelect)},
|
{Settings::NativeInput::Values::SELECT, ui->buttonSelect},
|
||||||
{std::make_pair(Settings::NativeInput::Values::HOME, ui->buttonHome)},
|
{Settings::NativeInput::Values::HOME, ui->buttonHome},
|
||||||
{std::make_pair(Settings::NativeInput::Values::DUP, ui->buttonDpadUp)},
|
{Settings::NativeInput::Values::DUP, ui->buttonDpadUp},
|
||||||
{std::make_pair(Settings::NativeInput::Values::DDOWN, ui->buttonDpadDown)},
|
{Settings::NativeInput::Values::DDOWN, ui->buttonDpadDown},
|
||||||
{std::make_pair(Settings::NativeInput::Values::DLEFT, ui->buttonDpadLeft)},
|
{Settings::NativeInput::Values::DLEFT, ui->buttonDpadLeft},
|
||||||
{std::make_pair(Settings::NativeInput::Values::DRIGHT, ui->buttonDpadRight)},
|
{Settings::NativeInput::Values::DRIGHT, ui->buttonDpadRight},
|
||||||
{std::make_pair(Settings::NativeInput::Values::CUP, ui->buttonCStickUp)},
|
{Settings::NativeInput::Values::CUP, ui->buttonCStickUp},
|
||||||
{std::make_pair(Settings::NativeInput::Values::CDOWN, ui->buttonCStickDown)},
|
{Settings::NativeInput::Values::CDOWN, ui->buttonCStickDown},
|
||||||
{std::make_pair(Settings::NativeInput::Values::CLEFT, ui->buttonCStickLeft)},
|
{Settings::NativeInput::Values::CLEFT, ui->buttonCStickLeft},
|
||||||
{std::make_pair(Settings::NativeInput::Values::CRIGHT, ui->buttonCStickRight)},
|
{Settings::NativeInput::Values::CRIGHT, ui->buttonCStickRight},
|
||||||
{std::make_pair(Settings::NativeInput::Values::CIRCLE_UP, ui->buttonCircleUp)},
|
{Settings::NativeInput::Values::CIRCLE_UP, ui->buttonCircleUp},
|
||||||
{std::make_pair(Settings::NativeInput::Values::CIRCLE_DOWN, ui->buttonCircleDown)},
|
{Settings::NativeInput::Values::CIRCLE_DOWN, ui->buttonCircleDown},
|
||||||
{std::make_pair(Settings::NativeInput::Values::CIRCLE_LEFT, ui->buttonCircleLeft)},
|
{Settings::NativeInput::Values::CIRCLE_LEFT, ui->buttonCircleLeft},
|
||||||
{std::make_pair(Settings::NativeInput::Values::CIRCLE_RIGHT, ui->buttonCircleRight)},
|
{Settings::NativeInput::Values::CIRCLE_RIGHT, ui->buttonCircleRight},
|
||||||
{std::make_pair(Settings::NativeInput::Values::CIRCLE_MODIFIER, ui->buttonCircleMod)},
|
{Settings::NativeInput::Values::CIRCLE_MODIFIER, ui->buttonCircleMod},
|
||||||
};
|
};
|
||||||
|
|
||||||
// Attach handle click method to each button click.
|
// Attach handle click method to each button click.
|
||||||
|
|
|
@ -10,7 +10,9 @@
|
||||||
#include "core/hle/service/fs/archive.h"
|
#include "core/hle/service/fs/archive.h"
|
||||||
#include "core/system.h"
|
#include "core/system.h"
|
||||||
|
|
||||||
static const std::array<int, 12> days_in_month = {{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
|
static const std::array<int, 12> days_in_month = {{
|
||||||
|
31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
|
||||||
|
}};
|
||||||
|
|
||||||
ConfigureSystem::ConfigureSystem(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureSystem) {
|
ConfigureSystem::ConfigureSystem(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureSystem) {
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
@ -20,8 +22,7 @@ ConfigureSystem::ConfigureSystem(QWidget* parent) : QWidget(parent), ui(new Ui::
|
||||||
this->setConfiguration();
|
this->setConfiguration();
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigureSystem::~ConfigureSystem() {
|
ConfigureSystem::~ConfigureSystem() {}
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigureSystem::setConfiguration() {
|
void ConfigureSystem::setConfiguration() {
|
||||||
enabled = !System::IsPoweredOn();
|
enabled = !System::IsPoweredOn();
|
||||||
|
@ -51,8 +52,8 @@ void ConfigureSystem::setConfiguration() {
|
||||||
void ConfigureSystem::ReadSystemSettings() {
|
void ConfigureSystem::ReadSystemSettings() {
|
||||||
// set username
|
// set username
|
||||||
username = Service::CFG::GetUsername();
|
username = Service::CFG::GetUsername();
|
||||||
// ui->edit_username->setText(QString::fromStdU16String(username)); // TODO(wwylele): Use this
|
// TODO(wwylele): Use this when we move to Qt 5.5
|
||||||
// when we move to Qt 5.5
|
// ui->edit_username->setText(QString::fromStdU16String(username));
|
||||||
ui->edit_username->setText(
|
ui->edit_username->setText(
|
||||||
QString::fromUtf16(reinterpret_cast<const ushort*>(username.data())));
|
QString::fromUtf16(reinterpret_cast<const ushort*>(username.data())));
|
||||||
|
|
||||||
|
@ -80,8 +81,8 @@ void ConfigureSystem::applyConfiguration() {
|
||||||
bool modified = false;
|
bool modified = false;
|
||||||
|
|
||||||
// apply username
|
// apply username
|
||||||
// std::u16string new_username = ui->edit_username->text().toStdU16String(); // TODO(wwylele):
|
// TODO(wwylele): Use this when we move to Qt 5.5
|
||||||
// Use this when we move to Qt 5.5
|
// std::u16string new_username = ui->edit_username->text().toStdU16String();
|
||||||
std::u16string new_username(
|
std::u16string new_username(
|
||||||
reinterpret_cast<const char16_t*>(ui->edit_username->text().utf16()));
|
reinterpret_cast<const char16_t*>(ui->edit_username->text().utf16()));
|
||||||
if (new_username != username) {
|
if (new_username != username) {
|
||||||
|
|
|
@ -78,8 +78,7 @@ void CallstackWidget::OnDebugModeEntered() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CallstackWidget::OnDebugModeLeft() {
|
void CallstackWidget::OnDebugModeLeft() {}
|
||||||
}
|
|
||||||
|
|
||||||
void CallstackWidget::Clear() {
|
void CallstackWidget::Clear() {
|
||||||
for (int row = 0; row < callstack_model->rowCount(); row++) {
|
for (int row = 0; row < callstack_model->rowCount(); row++) {
|
||||||
|
|
|
@ -19,8 +19,7 @@
|
||||||
|
|
||||||
DisassemblerModel::DisassemblerModel(QObject* parent)
|
DisassemblerModel::DisassemblerModel(QObject* parent)
|
||||||
: QAbstractListModel(parent), base_address(0), code_size(0), program_counter(0),
|
: QAbstractListModel(parent), base_address(0), code_size(0), program_counter(0),
|
||||||
selection(QModelIndex()) {
|
selection(QModelIndex()) {}
|
||||||
}
|
|
||||||
|
|
||||||
int DisassemblerModel::columnCount(const QModelIndex& parent) const {
|
int DisassemblerModel::columnCount(const QModelIndex& parent) const {
|
||||||
return 3;
|
return 3;
|
||||||
|
@ -241,8 +240,7 @@ void DisassemblerWidget::OnDebugModeEntered() {
|
||||||
model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
|
model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisassemblerWidget::OnDebugModeLeft() {
|
void DisassemblerWidget::OnDebugModeLeft() {}
|
||||||
}
|
|
||||||
|
|
||||||
int DisassemblerWidget::SelectedRow() {
|
int DisassemblerWidget::SelectedRow() {
|
||||||
QModelIndex index = disasm_ui.treeView->selectionModel()->currentIndex();
|
QModelIndex index = disasm_ui.treeView->selectionModel()->currentIndex();
|
||||||
|
|
|
@ -16,8 +16,7 @@
|
||||||
BreakPointModel::BreakPointModel(std::shared_ptr<Pica::DebugContext> debug_context, QObject* parent)
|
BreakPointModel::BreakPointModel(std::shared_ptr<Pica::DebugContext> debug_context, QObject* parent)
|
||||||
: QAbstractListModel(parent), context_weak(debug_context),
|
: QAbstractListModel(parent), context_weak(debug_context),
|
||||||
at_breakpoint(debug_context->at_breakpoint),
|
at_breakpoint(debug_context->at_breakpoint),
|
||||||
active_breakpoint(debug_context->active_breakpoint) {
|
active_breakpoint(debug_context->active_breakpoint) {}
|
||||||
}
|
|
||||||
|
|
||||||
int BreakPointModel::columnCount(const QModelIndex& parent) const {
|
int BreakPointModel::columnCount(const QModelIndex& parent) const {
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -42,7 +41,8 @@ QVariant BreakPointModel::data(const QModelIndex& index, int role) const {
|
||||||
{Pica::DebugContext::Event::IncomingDisplayTransfer,
|
{Pica::DebugContext::Event::IncomingDisplayTransfer,
|
||||||
tr("Incoming display transfer")},
|
tr("Incoming display transfer")},
|
||||||
{Pica::DebugContext::Event::GSPCommandProcessed, tr("GSP command processed")},
|
{Pica::DebugContext::Event::GSPCommandProcessed, tr("GSP command processed")},
|
||||||
{Pica::DebugContext::Event::BufferSwapped, tr("Buffers swapped")}};
|
{Pica::DebugContext::Event::BufferSwapped, tr("Buffers swapped")},
|
||||||
|
};
|
||||||
|
|
||||||
DEBUG_ASSERT(map.size() == static_cast<size_t>(Pica::DebugContext::Event::NumEvents));
|
DEBUG_ASSERT(map.size() == static_cast<size_t>(Pica::DebugContext::Event::NumEvents));
|
||||||
return (map.find(event) != map.end()) ? map.at(event) : QString();
|
return (map.find(event) != map.end()) ? map.at(event) : QString();
|
||||||
|
|
|
@ -51,8 +51,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
GPUCommandListModel::GPUCommandListModel(QObject* parent) : QAbstractListModel(parent) {
|
GPUCommandListModel::GPUCommandListModel(QObject* parent) : QAbstractListModel(parent) {}
|
||||||
}
|
|
||||||
|
|
||||||
int GPUCommandListModel::rowCount(const QModelIndex& parent) const {
|
int GPUCommandListModel::rowCount(const QModelIndex& parent) const {
|
||||||
return static_cast<int>(pica_trace.writes.size());
|
return static_cast<int>(pica_trace.writes.size());
|
||||||
|
|
|
@ -25,10 +25,8 @@
|
||||||
#include "video_core/utils.h"
|
#include "video_core/utils.h"
|
||||||
|
|
||||||
SurfacePicture::SurfacePicture(QWidget* parent, GraphicsSurfaceWidget* surface_widget_)
|
SurfacePicture::SurfacePicture(QWidget* parent, GraphicsSurfaceWidget* surface_widget_)
|
||||||
: QLabel(parent), surface_widget(surface_widget_) {
|
: QLabel(parent), surface_widget(surface_widget_) {}
|
||||||
}
|
SurfacePicture::~SurfacePicture() {}
|
||||||
SurfacePicture::~SurfacePicture() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void SurfacePicture::mousePressEvent(QMouseEvent* event) {
|
void SurfacePicture::mousePressEvent(QMouseEvent* event) {
|
||||||
// Only do something while the left mouse button is held down
|
// Only do something while the left mouse button is held down
|
||||||
|
@ -707,9 +705,8 @@ unsigned int GraphicsSurfaceWidget::NibblesPerPixel(GraphicsSurfaceWidget::Forma
|
||||||
case Format::D16:
|
case Format::D16:
|
||||||
return 2 * 2;
|
return 2 * 2;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE_MSG("GraphicsSurfaceWidget::BytesPerPixel: this "
|
UNREACHABLE_MSG("GraphicsSurfaceWidget::BytesPerPixel: this should not be reached as this "
|
||||||
"should not be reached as this function should "
|
"function should be given a format which is in "
|
||||||
"be given a format which is in "
|
|
||||||
"GraphicsSurfaceWidget::Format. Instead got %i",
|
"GraphicsSurfaceWidget::Format. Instead got %i",
|
||||||
static_cast<int>(format));
|
static_cast<int>(format));
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -29,8 +29,7 @@ using nihstro::SourceRegister;
|
||||||
using nihstro::SwizzlePattern;
|
using nihstro::SwizzlePattern;
|
||||||
|
|
||||||
GraphicsVertexShaderModel::GraphicsVertexShaderModel(GraphicsVertexShaderWidget* parent)
|
GraphicsVertexShaderModel::GraphicsVertexShaderModel(GraphicsVertexShaderWidget* parent)
|
||||||
: QAbstractTableModel(parent), par(parent) {
|
: QAbstractTableModel(parent), par(parent) {}
|
||||||
}
|
|
||||||
|
|
||||||
int GraphicsVertexShaderModel::columnCount(const QModelIndex& parent) const {
|
int GraphicsVertexShaderModel::columnCount(const QModelIndex& parent) const {
|
||||||
return 3;
|
return 3;
|
||||||
|
|
|
@ -4,8 +4,7 @@
|
||||||
|
|
||||||
#include "citra_qt/debugger/ramview.h"
|
#include "citra_qt/debugger/ramview.h"
|
||||||
|
|
||||||
GRamView::GRamView(QWidget* parent) : QHexEdit(parent) {
|
GRamView::GRamView(QWidget* parent) : QHexEdit(parent) {}
|
||||||
}
|
|
||||||
|
|
||||||
void GRamView::OnCPUStepped() {
|
void GRamView::OnCPUStepped() {
|
||||||
// TODO: QHexEdit doesn't show vertical scroll bars for > 10MB data streams...
|
// TODO: QHexEdit doesn't show vertical scroll bars for > 10MB data streams...
|
||||||
|
|
|
@ -75,8 +75,7 @@ void RegistersWidget::OnDebugModeEntered() {
|
||||||
UpdateVFPSystemRegisterValues();
|
UpdateVFPSystemRegisterValues();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegistersWidget::OnDebugModeLeft() {
|
void RegistersWidget::OnDebugModeLeft() {}
|
||||||
}
|
|
||||||
|
|
||||||
void RegistersWidget::OnEmulationStarting(EmuThread* emu_thread) {
|
void RegistersWidget::OnEmulationStarting(EmuThread* emu_thread) {
|
||||||
setEnabled(true);
|
setEnabled(true);
|
||||||
|
|
|
@ -59,12 +59,9 @@ static QString GetQStringShortTitleFromSMDH(const Loader::SMDH& smdh,
|
||||||
class GameListItem : public QStandardItem {
|
class GameListItem : public QStandardItem {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GameListItem() : QStandardItem() {
|
GameListItem() : QStandardItem() {}
|
||||||
}
|
GameListItem(const QString& string) : QStandardItem(string) {}
|
||||||
GameListItem(const QString& string) : QStandardItem(string) {
|
virtual ~GameListItem() override {}
|
||||||
}
|
|
||||||
virtual ~GameListItem() override {
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -79,8 +76,7 @@ public:
|
||||||
static const int FullPathRole = Qt::UserRole + 1;
|
static const int FullPathRole = Qt::UserRole + 1;
|
||||||
static const int TitleRole = Qt::UserRole + 2;
|
static const int TitleRole = Qt::UserRole + 2;
|
||||||
|
|
||||||
GameListItemPath() : GameListItem() {
|
GameListItemPath() : GameListItem() {}
|
||||||
}
|
|
||||||
GameListItemPath(const QString& game_path, const std::vector<u8>& smdh_data) : GameListItem() {
|
GameListItemPath(const QString& game_path, const std::vector<u8>& smdh_data) : GameListItem() {
|
||||||
setData(game_path, FullPathRole);
|
setData(game_path, FullPathRole);
|
||||||
|
|
||||||
|
@ -124,8 +120,7 @@ class GameListItemSize : public GameListItem {
|
||||||
public:
|
public:
|
||||||
static const int SizeRole = Qt::UserRole + 1;
|
static const int SizeRole = Qt::UserRole + 1;
|
||||||
|
|
||||||
GameListItemSize() : GameListItem() {
|
GameListItemSize() : GameListItem() {}
|
||||||
}
|
|
||||||
GameListItemSize(const qulonglong size_bytes) : GameListItem() {
|
GameListItemSize(const qulonglong size_bytes) : GameListItem() {
|
||||||
setData(size_bytes, SizeRole);
|
setData(size_bytes, SizeRole);
|
||||||
}
|
}
|
||||||
|
@ -161,8 +156,7 @@ class GameListWorker : public QObject, public QRunnable {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GameListWorker(QString dir_path, bool deep_scan)
|
GameListWorker(QString dir_path, bool deep_scan)
|
||||||
: QObject(), QRunnable(), dir_path(dir_path), deep_scan(deep_scan) {
|
: QObject(), QRunnable(), dir_path(dir_path), deep_scan(deep_scan) {}
|
||||||
}
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
/// Starts the processing of directory tree information.
|
/// Starts the processing of directory tree information.
|
||||||
|
|
|
@ -12,8 +12,7 @@
|
||||||
#include "citra_qt/ui_settings.h"
|
#include "citra_qt/ui_settings.h"
|
||||||
|
|
||||||
struct Hotkey {
|
struct Hotkey {
|
||||||
Hotkey() : shortcut(nullptr), context(Qt::WindowShortcut) {
|
Hotkey() : shortcut(nullptr), context(Qt::WindowShortcut) {}
|
||||||
}
|
|
||||||
|
|
||||||
QKeySequence keyseq;
|
QKeySequence keyseq;
|
||||||
QShortcut* shortcut;
|
QShortcut* shortcut;
|
||||||
|
|
|
@ -26,8 +26,8 @@ class GPUCommandListWidget;
|
||||||
class GMainWindow : public QMainWindow {
|
class GMainWindow : public QMainWindow {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
static const int max_recent_files_item =
|
/// Max number of recently loaded items to keep track of
|
||||||
10; ///< Max number of recently loaded items to keep track
|
static const int max_recent_files_item = 10;
|
||||||
|
|
||||||
// TODO: Make use of this!
|
// TODO: Make use of this!
|
||||||
enum {
|
enum {
|
||||||
|
|
|
@ -102,10 +102,8 @@ public:
|
||||||
// A reference to a particular bit, returned from operator[].
|
// A reference to a particular bit, returned from operator[].
|
||||||
class Ref {
|
class Ref {
|
||||||
public:
|
public:
|
||||||
Ref(Ref&& other) : m_bs(other.m_bs), m_mask(other.m_mask) {
|
Ref(Ref&& other) : m_bs(other.m_bs), m_mask(other.m_mask) {}
|
||||||
}
|
Ref(BitSet* bs, IntTy mask) : m_bs(bs), m_mask(mask) {}
|
||||||
Ref(BitSet* bs, IntTy mask) : m_bs(bs), m_mask(mask) {
|
|
||||||
}
|
|
||||||
operator bool() const {
|
operator bool() const {
|
||||||
return (m_bs->m_val & m_mask) != 0;
|
return (m_bs->m_val & m_mask) != 0;
|
||||||
}
|
}
|
||||||
|
@ -122,10 +120,8 @@ public:
|
||||||
// A STL-like iterator is required to be able to use range-based for loops.
|
// A STL-like iterator is required to be able to use range-based for loops.
|
||||||
class Iterator {
|
class Iterator {
|
||||||
public:
|
public:
|
||||||
Iterator(const Iterator& other) : m_val(other.m_val), m_bit(other.m_bit) {
|
Iterator(const Iterator& other) : m_val(other.m_val), m_bit(other.m_bit) {}
|
||||||
}
|
Iterator(IntTy val, int bit) : m_val(val), m_bit(bit) {}
|
||||||
Iterator(IntTy val, int bit) : m_val(val), m_bit(bit) {
|
|
||||||
}
|
|
||||||
Iterator& operator=(Iterator other) {
|
Iterator& operator=(Iterator other) {
|
||||||
new (this) Iterator(other);
|
new (this) Iterator(other);
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -160,10 +156,8 @@ public:
|
||||||
int m_bit;
|
int m_bit;
|
||||||
};
|
};
|
||||||
|
|
||||||
BitSet() : m_val(0) {
|
BitSet() : m_val(0) {}
|
||||||
}
|
explicit BitSet(IntTy val) : m_val(val) {}
|
||||||
explicit BitSet(IntTy val) : m_val(val) {
|
|
||||||
}
|
|
||||||
BitSet(std::initializer_list<int> init) {
|
BitSet(std::initializer_list<int> init) {
|
||||||
m_val = 0;
|
m_val = 0;
|
||||||
for (int bit : init)
|
for (int bit : init)
|
||||||
|
|
|
@ -50,8 +50,7 @@ class PointerWrap;
|
||||||
class PointerWrapSection {
|
class PointerWrapSection {
|
||||||
public:
|
public:
|
||||||
PointerWrapSection(PointerWrap& p, int ver, const char* title)
|
PointerWrapSection(PointerWrap& p, int ver, const char* title)
|
||||||
: p_(p), ver_(ver), title_(title) {
|
: p_(p), ver_(ver), title_(title) {}
|
||||||
}
|
|
||||||
~PointerWrapSection();
|
~PointerWrapSection();
|
||||||
|
|
||||||
bool operator==(const int& v) const {
|
bool operator==(const int& v) const {
|
||||||
|
@ -134,11 +133,9 @@ public:
|
||||||
Error error;
|
Error error;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PointerWrap(u8** ptr_, Mode mode_) : ptr(ptr_), mode(mode_), error(ERROR_NONE) {
|
PointerWrap(u8** ptr_, Mode mode_) : ptr(ptr_), mode(mode_), error(ERROR_NONE) {}
|
||||||
}
|
|
||||||
PointerWrap(unsigned char** ptr_, int mode_)
|
PointerWrap(unsigned char** ptr_, int mode_)
|
||||||
: ptr((u8**)ptr_), mode((Mode)mode_), error(ERROR_NONE) {
|
: ptr((u8**)ptr_), mode((Mode)mode_), error(ERROR_NONE) {}
|
||||||
}
|
|
||||||
|
|
||||||
PointerWrapSection Section(const char* title, int ver) {
|
PointerWrapSection Section(const char* title, int ver) {
|
||||||
return Section(title, ver, ver);
|
return Section(title, ver, ver);
|
||||||
|
|
|
@ -27,8 +27,7 @@ protected:
|
||||||
size_t region_size;
|
size_t region_size;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CodeBlock() : region(nullptr), region_size(0) {
|
CodeBlock() : region(nullptr), region_size(0) {}
|
||||||
}
|
|
||||||
virtual ~CodeBlock() {
|
virtual ~CodeBlock() {
|
||||||
if (region)
|
if (region)
|
||||||
FreeCodeSpace();
|
FreeCodeSpace();
|
||||||
|
|
|
@ -86,8 +86,7 @@ inline u64 _rotr64(u64 x, unsigned int shift) {
|
||||||
extern "C" {
|
extern "C" {
|
||||||
__declspec(dllimport) void __stdcall DebugBreak(void);
|
__declspec(dllimport) void __stdcall DebugBreak(void);
|
||||||
}
|
}
|
||||||
#define Crash() \
|
#define Crash() DebugBreak()
|
||||||
{ DebugBreak(); }
|
|
||||||
|
|
||||||
// cstdlib provides these on MSVC
|
// cstdlib provides these on MSVC
|
||||||
#define rotr _rotr
|
#define rotr _rotr
|
||||||
|
|
|
@ -229,8 +229,7 @@ protected:
|
||||||
circle_pad_y = 0;
|
circle_pad_y = 0;
|
||||||
touch_pressed = false;
|
touch_pressed = false;
|
||||||
}
|
}
|
||||||
virtual ~EmuWindow() {
|
virtual ~EmuWindow() {}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Processes any pending configuration changes from the last SetConfig call.
|
* Processes any pending configuration changes from the last SetConfig call.
|
||||||
|
@ -272,8 +271,8 @@ private:
|
||||||
* For the request to be honored, EmuWindow implementations will usually reimplement this
|
* For the request to be honored, EmuWindow implementations will usually reimplement this
|
||||||
* function.
|
* function.
|
||||||
*/
|
*/
|
||||||
virtual void
|
virtual void OnMinimalClientAreaChangeRequest(
|
||||||
OnMinimalClientAreaChangeRequest(const std::pair<unsigned, unsigned>& minimal_size) {
|
const std::pair<unsigned, unsigned>& minimal_size) {
|
||||||
// By default, ignore this request and do nothing.
|
// By default, ignore this request and do nothing.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -828,8 +828,7 @@ void SplitFilename83(const std::string& filename, std::array<char, 9>& short_nam
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IOFile::IOFile() {
|
IOFile::IOFile() {}
|
||||||
}
|
|
||||||
|
|
||||||
IOFile::IOFile(const std::string& filename, const char openmode[]) {
|
IOFile::IOFile(const std::string& filename, const char openmode[]) {
|
||||||
Open(filename, openmode);
|
Open(filename, openmode);
|
||||||
|
|
|
@ -27,12 +27,10 @@ struct Rectangle {
|
||||||
T right;
|
T right;
|
||||||
T bottom;
|
T bottom;
|
||||||
|
|
||||||
Rectangle() {
|
Rectangle() {}
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle(T left, T top, T right, T bottom)
|
Rectangle(T left, T top, T right, T bottom)
|
||||||
: left(left), top(top), right(right), bottom(bottom) {
|
: left(left), top(top), right(right), bottom(bottom) {}
|
||||||
}
|
|
||||||
|
|
||||||
T GetWidth() const {
|
T GetWidth() const {
|
||||||
return std::abs(static_cast<typename std::make_signed<T>::type>(right - left));
|
return std::abs(static_cast<typename std::make_signed<T>::type>(right - left));
|
||||||
|
|
|
@ -14,8 +14,7 @@ namespace Common {
|
||||||
namespace Profiling {
|
namespace Profiling {
|
||||||
|
|
||||||
ProfilingManager::ProfilingManager()
|
ProfilingManager::ProfilingManager()
|
||||||
: last_frame_end(Clock::now()), this_frame_start(Clock::now()) {
|
: last_frame_end(Clock::now()), this_frame_start(Clock::now()) {}
|
||||||
}
|
|
||||||
|
|
||||||
void ProfilingManager::BeginFrame() {
|
void ProfilingManager::BeginFrame() {
|
||||||
this_frame_start = Clock::now();
|
this_frame_start = Clock::now();
|
||||||
|
|
|
@ -10,8 +10,7 @@
|
||||||
namespace detail {
|
namespace detail {
|
||||||
template <typename Func>
|
template <typename Func>
|
||||||
struct ScopeExitHelper {
|
struct ScopeExitHelper {
|
||||||
explicit ScopeExitHelper(Func&& func) : func(std::move(func)) {
|
explicit ScopeExitHelper(Func&& func) : func(std::move(func)) {}
|
||||||
}
|
|
||||||
~ScopeExitHelper() {
|
~ScopeExitHelper() {
|
||||||
func();
|
func();
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,8 +168,7 @@ public:
|
||||||
return swap(value);
|
return swap(value);
|
||||||
}
|
}
|
||||||
swap_struct_t() = default;
|
swap_struct_t() = default;
|
||||||
swap_struct_t(const T& v) : value(swap(v)) {
|
swap_struct_t(const T& v) : value(swap(v)) {}
|
||||||
}
|
|
||||||
|
|
||||||
template <typename S>
|
template <typename S>
|
||||||
swapped_t& operator=(const S& source) {
|
swapped_t& operator=(const S& source) {
|
||||||
|
|
|
@ -19,8 +19,7 @@ template <typename T>
|
||||||
class SynchronizedWrapper {
|
class SynchronizedWrapper {
|
||||||
public:
|
public:
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
SynchronizedWrapper(Args&&... args) : data(std::forward<Args>(args)...) {
|
SynchronizedWrapper(Args&&... args) : data(std::forward<Args>(args)...) {}
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename U>
|
template <typename U>
|
||||||
|
|
|
@ -39,8 +39,7 @@ void SetCurrentThreadAffinity(u32 mask);
|
||||||
|
|
||||||
class Event {
|
class Event {
|
||||||
public:
|
public:
|
||||||
Event() : is_set(false) {
|
Event() : is_set(false) {}
|
||||||
}
|
|
||||||
|
|
||||||
void Set() {
|
void Set() {
|
||||||
std::lock_guard<std::mutex> lk(mutex);
|
std::lock_guard<std::mutex> lk(mutex);
|
||||||
|
@ -71,8 +70,7 @@ private:
|
||||||
|
|
||||||
class Barrier {
|
class Barrier {
|
||||||
public:
|
public:
|
||||||
explicit Barrier(size_t count_) : count(count_), waiting(0), generation(0) {
|
explicit Barrier(size_t count_) : count(count_), waiting(0), generation(0) {}
|
||||||
}
|
|
||||||
|
|
||||||
/// Blocks until all "count" threads have called Sync()
|
/// Blocks until all "count" threads have called Sync()
|
||||||
void Sync() {
|
void Sync() {
|
||||||
|
|
|
@ -60,10 +60,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec2() = default;
|
Vec2() = default;
|
||||||
Vec2(const T a[2]) : x(a[0]), y(a[1]) {
|
Vec2(const T a[2]) : x(a[0]), y(a[1]) {}
|
||||||
}
|
Vec2(const T& _x, const T& _y) : x(_x), y(_y) {}
|
||||||
Vec2(const T& _x, const T& _y) : x(_x), y(_y) {
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T2>
|
template <typename T2>
|
||||||
Vec2<T2> Cast() const {
|
Vec2<T2> Cast() const {
|
||||||
|
@ -201,10 +199,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec3() = default;
|
Vec3() = default;
|
||||||
Vec3(const T a[3]) : x(a[0]), y(a[1]), z(a[2]) {
|
Vec3(const T a[3]) : x(a[0]), y(a[1]), z(a[2]) {}
|
||||||
}
|
Vec3(const T& _x, const T& _y, const T& _z) : x(_x), y(_y), z(_z) {}
|
||||||
Vec3(const T& _x, const T& _y, const T& _z) : x(_x), y(_y), z(_z) {
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T2>
|
template <typename T2>
|
||||||
Vec3<T2> Cast() const {
|
Vec3<T2> Cast() const {
|
||||||
|
@ -409,10 +405,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec4() = default;
|
Vec4() = default;
|
||||||
Vec4(const T a[4]) : x(a[0]), y(a[1]), z(a[2]), w(a[3]) {
|
Vec4(const T a[4]) : x(a[0]), y(a[1]), z(a[2]), w(a[3]) {}
|
||||||
}
|
Vec4(const T& _x, const T& _y, const T& _z, const T& _w) : x(_x), y(_y), z(_z), w(_w) {}
|
||||||
Vec4(const T& _x, const T& _y, const T& _z, const T& _w) : x(_x), y(_y), z(_z), w(_w) {
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T2>
|
template <typename T2>
|
||||||
Vec4<T2> Cast() const {
|
Vec4<T2> Cast() const {
|
||||||
|
|
|
@ -222,7 +222,7 @@ void OpArg::WriteVex(XEmitter* emit, X64Reg regOp1, X64Reg regOp2, int L, int pp
|
||||||
void OpArg::WriteRest(XEmitter* emit, int extraBytes, X64Reg _operandReg,
|
void OpArg::WriteRest(XEmitter* emit, int extraBytes, X64Reg _operandReg,
|
||||||
bool warn_64bit_offset) const {
|
bool warn_64bit_offset) const {
|
||||||
if (_operandReg == INVALID_REG)
|
if (_operandReg == INVALID_REG)
|
||||||
_operandReg = (X64Reg) this->operandReg;
|
_operandReg = (X64Reg)this->operandReg;
|
||||||
int mod = 0;
|
int mod = 0;
|
||||||
int ireg = indexReg;
|
int ireg = indexReg;
|
||||||
bool SIB = false;
|
bool SIB = false;
|
||||||
|
|
|
@ -233,8 +233,7 @@ struct OpArg {
|
||||||
constexpr OpArg() = default; // dummy op arg, used for storage
|
constexpr OpArg() = default; // dummy op arg, used for storage
|
||||||
constexpr OpArg(u64 offset_, int scale_, X64Reg rmReg = RAX, X64Reg scaledReg = RAX)
|
constexpr OpArg(u64 offset_, int scale_, X64Reg rmReg = RAX, X64Reg scaledReg = RAX)
|
||||||
: scale(static_cast<u8>(scale_)), offsetOrBaseReg(static_cast<u16>(rmReg)),
|
: scale(static_cast<u8>(scale_)), offsetOrBaseReg(static_cast<u16>(rmReg)),
|
||||||
indexReg(static_cast<u16>(scaledReg)), offset(offset_) {
|
indexReg(static_cast<u16>(scaledReg)), offset(offset_) {}
|
||||||
}
|
|
||||||
|
|
||||||
constexpr bool operator==(const OpArg& b) const {
|
constexpr bool operator==(const OpArg& b) const {
|
||||||
return operandReg == b.operandReg && scale == b.scale &&
|
return operandReg == b.operandReg && scale == b.scale &&
|
||||||
|
@ -454,8 +453,7 @@ public:
|
||||||
code = code_ptr;
|
code = code_ptr;
|
||||||
flags_locked = false;
|
flags_locked = false;
|
||||||
}
|
}
|
||||||
virtual ~XEmitter() {
|
virtual ~XEmitter() {}
|
||||||
}
|
|
||||||
|
|
||||||
void WriteModRM(int mod, int rm, int reg);
|
void WriteModRM(int mod, int rm, int reg);
|
||||||
void WriteSIB(int scale, int index, int base);
|
void WriteSIB(int scale, int index, int base);
|
||||||
|
|
|
@ -15,8 +15,7 @@ struct ThreadContext;
|
||||||
/// Generic ARM11 CPU interface
|
/// Generic ARM11 CPU interface
|
||||||
class ARM_Interface : NonCopyable {
|
class ARM_Interface : NonCopyable {
|
||||||
public:
|
public:
|
||||||
virtual ~ARM_Interface() {
|
virtual ~ARM_Interface() {}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs the CPU for the given number of instructions
|
* Runs the CPU for the given number of instructions
|
||||||
|
|
|
@ -21,8 +21,7 @@ ARM_DynCom::ARM_DynCom(PrivilegeMode initial_mode) {
|
||||||
state = std::make_unique<ARMul_State>(initial_mode);
|
state = std::make_unique<ARMul_State>(initial_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
ARM_DynCom::~ARM_DynCom() {
|
ARM_DynCom::~ARM_DynCom() {}
|
||||||
}
|
|
||||||
|
|
||||||
void ARM_DynCom::ClearInstructionCache() {
|
void ARM_DynCom::ClearInstructionCache() {
|
||||||
state->instruction_cache.clear();
|
state->instruction_cache.clear();
|
||||||
|
|
|
@ -1883,6 +1883,7 @@ const transop_fp_t arm_instruction_trans[] = {
|
||||||
// All the thumb instructions should be placed the end of table
|
// All the thumb instructions should be placed the end of table
|
||||||
INTERPRETER_TRANSLATE(b_2_thumb), INTERPRETER_TRANSLATE(b_cond_thumb),
|
INTERPRETER_TRANSLATE(b_2_thumb), INTERPRETER_TRANSLATE(b_cond_thumb),
|
||||||
INTERPRETER_TRANSLATE(bl_1_thumb), INTERPRETER_TRANSLATE(bl_2_thumb),
|
INTERPRETER_TRANSLATE(bl_1_thumb), INTERPRETER_TRANSLATE(bl_2_thumb),
|
||||||
INTERPRETER_TRANSLATE(blx_1_thumb)};
|
INTERPRETER_TRANSLATE(blx_1_thumb),
|
||||||
|
};
|
||||||
|
|
||||||
const size_t arm_instruction_trans_len = sizeof(arm_instruction_trans) / sizeof(transop_fp_t);
|
const size_t arm_instruction_trans_len = sizeof(arm_instruction_trans) / sizeof(transop_fp_t);
|
||||||
|
|
|
@ -237,10 +237,8 @@ private:
|
||||||
void ResetMPCoreCP15Registers();
|
void ResetMPCoreCP15Registers();
|
||||||
|
|
||||||
// Defines a reservation granule of 2 words, which protects the first 2 words starting at the
|
// Defines a reservation granule of 2 words, which protects the first 2 words starting at the
|
||||||
// tag.
|
// tag. This is the smallest granule allowed by the v7 spec, and is coincidentally just large
|
||||||
// This is the smallest granule allowed by the v7 spec, and is coincidentally just large enough
|
// enough to support LDR/STREXD.
|
||||||
// to
|
|
||||||
// support LDR/STREXD.
|
|
||||||
static const u32 RESERVATION_GRANULE_MASK = 0xFFFFFFF8;
|
static const u32 RESERVATION_GRANULE_MASK = 0xFFFFFFF8;
|
||||||
|
|
||||||
u32 exclusive_tag; // The address for which the local monitor is in exclusive access mode
|
u32 exclusive_tag; // The address for which the local monitor is in exclusive access mode
|
||||||
|
|
|
@ -51,10 +51,10 @@
|
||||||
* ===========================================================================
|
* ===========================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "core/arm/skyeye_common/vfp/vfp.h"
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/arm/skyeye_common/vfp/asm_vfp.h"
|
#include "core/arm/skyeye_common/vfp/asm_vfp.h"
|
||||||
|
#include "core/arm/skyeye_common/vfp/vfp.h"
|
||||||
#include "core/arm/skyeye_common/vfp/vfp_helper.h"
|
#include "core/arm/skyeye_common/vfp/vfp_helper.h"
|
||||||
|
|
||||||
static struct vfp_double vfp_double_default_qnan = {
|
static struct vfp_double vfp_double_default_qnan = {
|
||||||
|
|
|
@ -280,13 +280,15 @@ static u32 vfp_single_fneg(ARMul_State* state, int sd, int unused, s32 m, u32 fp
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const u16 sqrt_oddadjust[] = {0x0004, 0x0022, 0x005d, 0x00b1, 0x011d, 0x019f,
|
static const u16 sqrt_oddadjust[] = {
|
||||||
0x0236, 0x02e0, 0x039c, 0x0468, 0x0545, 0x0631,
|
0x0004, 0x0022, 0x005d, 0x00b1, 0x011d, 0x019f, 0x0236, 0x02e0,
|
||||||
0x072b, 0x0832, 0x0946, 0x0a67};
|
0x039c, 0x0468, 0x0545, 0x0631, 0x072b, 0x0832, 0x0946, 0x0a67,
|
||||||
|
};
|
||||||
|
|
||||||
static const u16 sqrt_evenadjust[] = {0x0a2d, 0x08af, 0x075a, 0x0629, 0x051a, 0x0429,
|
static const u16 sqrt_evenadjust[] = {
|
||||||
0x0356, 0x029e, 0x0200, 0x0179, 0x0109, 0x00af,
|
0x0a2d, 0x08af, 0x075a, 0x0629, 0x051a, 0x0429, 0x0356, 0x029e,
|
||||||
0x0068, 0x0034, 0x0012, 0x0002};
|
0x0200, 0x0179, 0x0109, 0x00af, 0x0068, 0x0034, 0x0012, 0x0002,
|
||||||
|
};
|
||||||
|
|
||||||
u32 vfp_estimate_sqrt_significand(u32 exponent, u32 significand) {
|
u32 vfp_estimate_sqrt_significand(u32 exponent, u32 significand) {
|
||||||
int index;
|
int index;
|
||||||
|
|
|
@ -28,8 +28,7 @@ void RunLoop(int tight_loop) {
|
||||||
GDBStub::HandlePacket();
|
GDBStub::HandlePacket();
|
||||||
|
|
||||||
// If the loop is halted and we want to step, use a tiny (1) number of instructions to
|
// If the loop is halted and we want to step, use a tiny (1) number of instructions to
|
||||||
// execute.
|
// execute. Otherwise, get out of the loop function.
|
||||||
// Otherwise get out of the loop function.
|
|
||||||
if (GDBStub::GetCpuHaltFlag()) {
|
if (GDBStub::GetCpuHaltFlag()) {
|
||||||
if (GDBStub::GetCpuStepFlag()) {
|
if (GDBStub::GetCpuStepFlag()) {
|
||||||
GDBStub::SetCpuStepFlag(false);
|
GDBStub::SetCpuStepFlag(false);
|
||||||
|
|
|
@ -23,11 +23,9 @@ int g_clock_rate_arm11 = 268123480;
|
||||||
|
|
||||||
namespace CoreTiming {
|
namespace CoreTiming {
|
||||||
struct EventType {
|
struct EventType {
|
||||||
EventType() {
|
EventType() {}
|
||||||
}
|
|
||||||
|
|
||||||
EventType(TimedCallback cb, const char* n) : callback(cb), name(n) {
|
EventType(TimedCallback cb, const char* n) : callback(cb), name(n) {}
|
||||||
}
|
|
||||||
|
|
||||||
TimedCallback callback;
|
TimedCallback callback;
|
||||||
const char* name;
|
const char* name;
|
||||||
|
|
|
@ -21,7 +21,13 @@ class FileBackend;
|
||||||
class DirectoryBackend;
|
class DirectoryBackend;
|
||||||
|
|
||||||
// Path string type
|
// Path string type
|
||||||
enum LowPathType : u32 { Invalid = 0, Empty = 1, Binary = 2, Char = 3, Wchar = 4 };
|
enum LowPathType : u32 {
|
||||||
|
Invalid = 0,
|
||||||
|
Empty = 1,
|
||||||
|
Binary = 2,
|
||||||
|
Char = 3,
|
||||||
|
Wchar = 4,
|
||||||
|
};
|
||||||
|
|
||||||
union Mode {
|
union Mode {
|
||||||
u32 hex;
|
u32 hex;
|
||||||
|
@ -32,12 +38,9 @@ union Mode {
|
||||||
|
|
||||||
class Path {
|
class Path {
|
||||||
public:
|
public:
|
||||||
Path() : type(Invalid) {
|
Path() : type(Invalid) {}
|
||||||
}
|
Path(const char* path) : type(Char), string(path) {}
|
||||||
Path(const char* path) : type(Char), string(path) {
|
Path(std::vector<u8> binary_data) : type(Binary), binary(std::move(binary_data)) {}
|
||||||
}
|
|
||||||
Path(std::vector<u8> binary_data) : type(Binary), binary(std::move(binary_data)) {
|
|
||||||
}
|
|
||||||
Path(LowPathType type, u32 size, u32 pointer);
|
Path(LowPathType type, u32 size, u32 pointer);
|
||||||
|
|
||||||
LowPathType GetType() const {
|
LowPathType GetType() const {
|
||||||
|
@ -61,22 +64,18 @@ private:
|
||||||
std::u16string u16str;
|
std::u16string u16str;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Parameters of the archive, as specified in the Create or Format call.
|
||||||
struct ArchiveFormatInfo {
|
struct ArchiveFormatInfo {
|
||||||
u32_le total_size; ///< The pre-defined size of the archive, as specified in the Create or
|
u32_le total_size; ///< The pre-defined size of the archive.
|
||||||
/// Format call
|
u32_le number_directories; ///< The pre-defined number of directories in the archive.
|
||||||
u32_le number_directories; ///< The pre-defined number of directories in the archive, as
|
u32_le number_files; ///< The pre-defined number of files in the archive.
|
||||||
/// specified in the Create or Format call
|
u8 duplicate_data; ///< Whether the archive should duplicate the data.
|
||||||
u32_le number_files; ///< The pre-defined number of files in the archive, as specified in the
|
|
||||||
/// Create or Format call
|
|
||||||
u8 duplicate_data; ///< Whether the archive should duplicate the data, as specified in the
|
|
||||||
/// Create or Format call
|
|
||||||
};
|
};
|
||||||
static_assert(std::is_pod<ArchiveFormatInfo>::value, "ArchiveFormatInfo is not POD");
|
static_assert(std::is_pod<ArchiveFormatInfo>::value, "ArchiveFormatInfo is not POD");
|
||||||
|
|
||||||
class ArchiveBackend : NonCopyable {
|
class ArchiveBackend : NonCopyable {
|
||||||
public:
|
public:
|
||||||
virtual ~ArchiveBackend() {
|
virtual ~ArchiveBackend() {}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a descriptive name for the archive (e.g. "RomFS", "SaveData", etc.)
|
* Get a descriptive name for the archive (e.g. "RomFS", "SaveData", etc.)
|
||||||
|
@ -153,8 +152,7 @@ public:
|
||||||
|
|
||||||
class ArchiveFactory : NonCopyable {
|
class ArchiveFactory : NonCopyable {
|
||||||
public:
|
public:
|
||||||
virtual ~ArchiveFactory() {
|
virtual ~ArchiveFactory() {}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a descriptive name for the archive (e.g. "RomFS", "SaveData", etc.)
|
* Get a descriptive name for the archive (e.g. "RomFS", "SaveData", etc.)
|
||||||
|
|
|
@ -48,11 +48,10 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SaveData::Open(const P
|
||||||
std::string concrete_mount_point =
|
std::string concrete_mount_point =
|
||||||
GetSaveDataPath(mount_point, Kernel::g_current_process->codeset->program_id);
|
GetSaveDataPath(mount_point, Kernel::g_current_process->codeset->program_id);
|
||||||
if (!FileUtil::Exists(concrete_mount_point)) {
|
if (!FileUtil::Exists(concrete_mount_point)) {
|
||||||
// When a SaveData archive is created for the first time, it is not yet formatted
|
// When a SaveData archive is created for the first time, it is not yet formatted and the
|
||||||
// and the save file/directory structure expected by the game has not yet been initialized.
|
// save file/directory structure expected by the game has not yet been initialized.
|
||||||
// Returning the NotFormatted error code will signal the game to provision the SaveData
|
// Returning the NotFormatted error code will signal the game to provision the SaveData
|
||||||
// archive
|
// archive with the files and folders that it expects.
|
||||||
// with the files and folders that it expects.
|
|
||||||
return ResultCode(ErrorDescription::FS_NotFormatted, ErrorModule::FS,
|
return ResultCode(ErrorDescription::FS_NotFormatted, ErrorModule::FS,
|
||||||
ErrorSummary::InvalidState, ErrorLevel::Status);
|
ErrorSummary::InvalidState, ErrorLevel::Status);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,8 +30,7 @@ static std::string GetSaveDataCheckPath(const std::string& mount_point, u32 high
|
||||||
}
|
}
|
||||||
|
|
||||||
ArchiveFactory_SaveDataCheck::ArchiveFactory_SaveDataCheck(const std::string& nand_directory)
|
ArchiveFactory_SaveDataCheck::ArchiveFactory_SaveDataCheck(const std::string& nand_directory)
|
||||||
: mount_point(GetSaveDataCheckContainerPath(nand_directory)) {
|
: mount_point(GetSaveDataCheckContainerPath(nand_directory)) {}
|
||||||
}
|
|
||||||
|
|
||||||
ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SaveDataCheck::Open(const Path& path) {
|
ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SaveDataCheck::Open(const Path& path) {
|
||||||
auto vec = path.AsBinary();
|
auto vec = path.AsBinary();
|
||||||
|
|
|
@ -49,8 +49,7 @@ Path ConstructSystemSaveDataBinaryPath(u32 high, u32 low) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ArchiveFactory_SystemSaveData::ArchiveFactory_SystemSaveData(const std::string& nand_path)
|
ArchiveFactory_SystemSaveData::ArchiveFactory_SystemSaveData(const std::string& nand_path)
|
||||||
: base_path(GetSystemSaveDataContainerPath(nand_path)) {
|
: base_path(GetSystemSaveDataContainerPath(nand_path)) {}
|
||||||
}
|
|
||||||
|
|
||||||
ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SystemSaveData::Open(const Path& path) {
|
ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SystemSaveData::Open(const Path& path) {
|
||||||
std::string fullpath = GetSystemSaveDataPath(base_path, path);
|
std::string fullpath = GetSystemSaveDataPath(base_path, path);
|
||||||
|
|
|
@ -38,10 +38,8 @@ static_assert(offsetof(Entry, file_size) == 0x220, "Wrong offset for file_size i
|
||||||
|
|
||||||
class DirectoryBackend : NonCopyable {
|
class DirectoryBackend : NonCopyable {
|
||||||
public:
|
public:
|
||||||
DirectoryBackend() {
|
DirectoryBackend() {}
|
||||||
}
|
virtual ~DirectoryBackend() {}
|
||||||
virtual ~DirectoryBackend() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open the directory
|
* Open the directory
|
||||||
|
|
|
@ -29,8 +29,7 @@ namespace FileSys {
|
||||||
*/
|
*/
|
||||||
class DiskArchive : public ArchiveBackend {
|
class DiskArchive : public ArchiveBackend {
|
||||||
public:
|
public:
|
||||||
DiskArchive(const std::string& mount_point_) : mount_point(mount_point_) {
|
DiskArchive(const std::string& mount_point_) : mount_point(mount_point_) {}
|
||||||
}
|
|
||||||
|
|
||||||
virtual std::string GetName() const override {
|
virtual std::string GetName() const override {
|
||||||
return "DiskArchive: " + mount_point;
|
return "DiskArchive: " + mount_point;
|
||||||
|
|
|
@ -16,10 +16,8 @@ namespace FileSys {
|
||||||
|
|
||||||
class FileBackend : NonCopyable {
|
class FileBackend : NonCopyable {
|
||||||
public:
|
public:
|
||||||
FileBackend() {
|
FileBackend() {}
|
||||||
}
|
virtual ~FileBackend() {}
|
||||||
virtual ~FileBackend() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open the file
|
* Open the file
|
||||||
|
|
|
@ -30,8 +30,7 @@ namespace FileSys {
|
||||||
class IVFCArchive : public ArchiveBackend {
|
class IVFCArchive : public ArchiveBackend {
|
||||||
public:
|
public:
|
||||||
IVFCArchive(std::shared_ptr<FileUtil::IOFile> file, u64 offset, u64 size)
|
IVFCArchive(std::shared_ptr<FileUtil::IOFile> file, u64 offset, u64 size)
|
||||||
: romfs_file(file), data_offset(offset), data_size(size) {
|
: romfs_file(file), data_offset(offset), data_size(size) {}
|
||||||
}
|
|
||||||
|
|
||||||
std::string GetName() const override;
|
std::string GetName() const override;
|
||||||
|
|
||||||
|
@ -55,8 +54,7 @@ protected:
|
||||||
class IVFCFile : public FileBackend {
|
class IVFCFile : public FileBackend {
|
||||||
public:
|
public:
|
||||||
IVFCFile(std::shared_ptr<FileUtil::IOFile> file, u64 offset, u64 size)
|
IVFCFile(std::shared_ptr<FileUtil::IOFile> file, u64 offset, u64 size)
|
||||||
: romfs_file(file), data_offset(offset), data_size(size) {
|
: romfs_file(file), data_offset(offset), data_size(size) {}
|
||||||
}
|
|
||||||
|
|
||||||
ResultCode Open() override {
|
ResultCode Open() override {
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
|
@ -68,8 +66,7 @@ public:
|
||||||
bool Close() const override {
|
bool Close() const override {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
void Flush() const override {
|
void Flush() const override {}
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<FileUtil::IOFile> romfs_file;
|
std::shared_ptr<FileUtil::IOFile> romfs_file;
|
||||||
|
|
|
@ -14,10 +14,8 @@ namespace Applets {
|
||||||
|
|
||||||
class Applet {
|
class Applet {
|
||||||
public:
|
public:
|
||||||
virtual ~Applet() {
|
virtual ~Applet() {}
|
||||||
}
|
Applet(Service::APT::AppletId id) : id(id) {}
|
||||||
Applet(Service::APT::AppletId id) : id(id) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an instance of the Applet subclass identified by the parameter.
|
* Creates an instance of the Applet subclass identified by the parameter.
|
||||||
|
|
|
@ -67,8 +67,7 @@ ResultCode ErrEula::StartImpl(const Service::APT::AppletStartupParameter& parame
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ErrEula::Update() {
|
void ErrEula::Update() {}
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Applets
|
} // namespace Applets
|
||||||
} // namespace HLE
|
} // namespace HLE
|
||||||
|
|
|
@ -12,8 +12,7 @@ namespace Applets {
|
||||||
|
|
||||||
class ErrEula final : public Applet {
|
class ErrEula final : public Applet {
|
||||||
public:
|
public:
|
||||||
explicit ErrEula(Service::APT::AppletId id) : Applet(id) {
|
explicit ErrEula(Service::APT::AppletId id) : Applet(id) {}
|
||||||
}
|
|
||||||
|
|
||||||
ResultCode ReceiveParameter(const Service::APT::MessageParameter& parameter) override;
|
ResultCode ReceiveParameter(const Service::APT::MessageParameter& parameter) override;
|
||||||
ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) override;
|
ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) override;
|
||||||
|
|
|
@ -85,7 +85,6 @@ ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& pa
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MiiSelector::Update() {
|
void MiiSelector::Update() {}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -66,8 +66,7 @@ ASSERT_REG_POSITION(unk_6C, 0x6C);
|
||||||
|
|
||||||
class MiiSelector final : public Applet {
|
class MiiSelector final : public Applet {
|
||||||
public:
|
public:
|
||||||
MiiSelector(Service::APT::AppletId id) : Applet(id), started(false) {
|
MiiSelector(Service::APT::AppletId id) : Applet(id), started(false) {}
|
||||||
}
|
|
||||||
|
|
||||||
ResultCode ReceiveParameter(const Service::APT::MessageParameter& parameter) override;
|
ResultCode ReceiveParameter(const Service::APT::MessageParameter& parameter) override;
|
||||||
ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) override;
|
ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) override;
|
||||||
|
|
|
@ -53,8 +53,7 @@ static_assert(sizeof(SoftwareKeyboardConfig) == 0x400, "Software Keyboard Config
|
||||||
|
|
||||||
class SoftwareKeyboard final : public Applet {
|
class SoftwareKeyboard final : public Applet {
|
||||||
public:
|
public:
|
||||||
SoftwareKeyboard(Service::APT::AppletId id) : Applet(id), started(false) {
|
SoftwareKeyboard(Service::APT::AppletId id) : Applet(id), started(false) {}
|
||||||
}
|
|
||||||
|
|
||||||
ResultCode ReceiveParameter(const Service::APT::MessageParameter& parameter) override;
|
ResultCode ReceiveParameter(const Service::APT::MessageParameter& parameter) override;
|
||||||
ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) override;
|
ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) override;
|
||||||
|
|
|
@ -16,10 +16,8 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
AddressArbiter::AddressArbiter() {
|
AddressArbiter::AddressArbiter() {}
|
||||||
}
|
AddressArbiter::~AddressArbiter() {}
|
||||||
AddressArbiter::~AddressArbiter() {
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedPtr<AddressArbiter> AddressArbiter::Create(std::string name) {
|
SharedPtr<AddressArbiter> AddressArbiter::Create(std::string name) {
|
||||||
SharedPtr<AddressArbiter> address_arbiter(new AddressArbiter);
|
SharedPtr<AddressArbiter> address_arbiter(new AddressArbiter);
|
||||||
|
|
|
@ -10,9 +10,7 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
ClientPort::ClientPort() {
|
ClientPort::ClientPort() {}
|
||||||
}
|
ClientPort::~ClientPort() {}
|
||||||
ClientPort::~ClientPort() {
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -14,10 +14,8 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
Event::Event() {
|
Event::Event() {}
|
||||||
}
|
Event::~Event() {}
|
||||||
Event::~Event() {
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedPtr<Event> Event::Create(ResetType reset_type, std::string name) {
|
SharedPtr<Event> Event::Create(ResetType reset_type, std::string name) {
|
||||||
SharedPtr<Event> evt(new Event);
|
SharedPtr<Event> evt(new Event);
|
||||||
|
|
|
@ -58,8 +58,7 @@ enum {
|
||||||
|
|
||||||
class Object : NonCopyable {
|
class Object : NonCopyable {
|
||||||
public:
|
public:
|
||||||
virtual ~Object() {
|
virtual ~Object() {}
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns a unique identifier for the object. For debugging purposes only.
|
/// Returns a unique identifier for the object. For debugging purposes only.
|
||||||
unsigned int GetObjectId() const {
|
unsigned int GetObjectId() const {
|
||||||
|
|
|
@ -33,10 +33,8 @@ void ReleaseThreadMutexes(Thread* thread) {
|
||||||
thread->held_mutexes.clear();
|
thread->held_mutexes.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
Mutex::Mutex() {
|
Mutex::Mutex() {}
|
||||||
}
|
Mutex::~Mutex() {}
|
||||||
Mutex::~Mutex() {
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedPtr<Mutex> Mutex::Create(bool initial_locked, std::string name) {
|
SharedPtr<Mutex> Mutex::Create(bool initial_locked, std::string name) {
|
||||||
SharedPtr<Mutex> mutex(new Mutex);
|
SharedPtr<Mutex> mutex(new Mutex);
|
||||||
|
|
|
@ -26,10 +26,8 @@ SharedPtr<CodeSet> CodeSet::Create(std::string name, u64 program_id) {
|
||||||
return codeset;
|
return codeset;
|
||||||
}
|
}
|
||||||
|
|
||||||
CodeSet::CodeSet() {
|
CodeSet::CodeSet() {}
|
||||||
}
|
CodeSet::~CodeSet() {}
|
||||||
CodeSet::~CodeSet() {
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 Process::next_process_id;
|
u32 Process::next_process_id;
|
||||||
|
|
||||||
|
@ -282,10 +280,8 @@ ResultCode Process::LinearFree(VAddr target, u32 size) {
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel::Process::Process() {
|
Kernel::Process::Process() {}
|
||||||
}
|
Kernel::Process::~Process() {}
|
||||||
Kernel::Process::~Process() {
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedPtr<Process> g_current_process;
|
SharedPtr<Process> g_current_process;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,10 +12,8 @@ namespace Kernel {
|
||||||
|
|
||||||
static SharedPtr<ResourceLimit> resource_limits[4];
|
static SharedPtr<ResourceLimit> resource_limits[4];
|
||||||
|
|
||||||
ResourceLimit::ResourceLimit() {
|
ResourceLimit::ResourceLimit() {}
|
||||||
}
|
ResourceLimit::~ResourceLimit() {}
|
||||||
ResourceLimit::~ResourceLimit() {
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedPtr<ResourceLimit> ResourceLimit::Create(std::string name) {
|
SharedPtr<ResourceLimit> ResourceLimit::Create(std::string name) {
|
||||||
SharedPtr<ResourceLimit> resource_limit(new ResourceLimit);
|
SharedPtr<ResourceLimit> resource_limit(new ResourceLimit);
|
||||||
|
@ -150,7 +148,6 @@ void ResourceLimitsInit() {
|
||||||
resource_limits[static_cast<u8>(ResourceLimitCategory::OTHER)] = resource_limit;
|
resource_limits[static_cast<u8>(ResourceLimitCategory::OTHER)] = resource_limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceLimitsShutdown() {
|
void ResourceLimitsShutdown() {}
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -92,8 +92,8 @@ public:
|
||||||
s32 max_cpu_time = 0;
|
s32 max_cpu_time = 0;
|
||||||
|
|
||||||
// TODO(Subv): Increment these in their respective Kernel::T::Create functions, keeping in mind
|
// TODO(Subv): Increment these in their respective Kernel::T::Create functions, keeping in mind
|
||||||
// that
|
// that APPLICATION resource limits should not be affected by the objects created by service
|
||||||
// APPLICATION resource limits should not be affected by the objects created by service modules.
|
// modules.
|
||||||
// Currently we have no way of distinguishing if a Create was called by the running application,
|
// Currently we have no way of distinguishing if a Create was called by the running application,
|
||||||
// or by a service module. Approach this once we have separated the service modules into their
|
// or by a service module. Approach this once we have separated the service modules into their
|
||||||
// own processes
|
// own processes
|
||||||
|
|
|
@ -10,10 +10,8 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
Semaphore::Semaphore() {
|
Semaphore::Semaphore() {}
|
||||||
}
|
Semaphore::~Semaphore() {}
|
||||||
Semaphore::~Semaphore() {
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_count,
|
ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_count,
|
||||||
std::string name) {
|
std::string name) {
|
||||||
|
|
|
@ -13,10 +13,8 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
ServerPort::ServerPort() {
|
ServerPort::ServerPort() {}
|
||||||
}
|
ServerPort::~ServerPort() {}
|
||||||
ServerPort::~ServerPort() {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ServerPort::ShouldWait() {
|
bool ServerPort::ShouldWait() {
|
||||||
// If there are no pending sessions, we wait until a new one is added.
|
// If there are no pending sessions, we wait until a new one is added.
|
||||||
|
@ -27,8 +25,9 @@ void ServerPort::Acquire() {
|
||||||
ASSERT_MSG(!ShouldWait(), "object unavailable!");
|
ASSERT_MSG(!ShouldWait(), "object unavailable!");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>>
|
std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> ServerPort::CreatePortPair(
|
||||||
ServerPort::CreatePortPair(u32 max_sessions, std::string name) {
|
u32 max_sessions, std::string name) {
|
||||||
|
|
||||||
SharedPtr<ServerPort> server_port(new ServerPort);
|
SharedPtr<ServerPort> server_port(new ServerPort);
|
||||||
SharedPtr<ClientPort> client_port(new ClientPort);
|
SharedPtr<ClientPort> client_port(new ClientPort);
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,8 @@ public:
|
||||||
* @param name Optional name of the ports
|
* @param name Optional name of the ports
|
||||||
* @return The created port tuple
|
* @return The created port tuple
|
||||||
*/
|
*/
|
||||||
static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>>
|
static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair(
|
||||||
CreatePortPair(u32 max_sessions, std::string name = "UnknownPort");
|
u32 max_sessions, std::string name = "UnknownPort");
|
||||||
|
|
||||||
std::string GetTypeName() const override {
|
std::string GetTypeName() const override {
|
||||||
return "ServerPort";
|
return "ServerPort";
|
||||||
|
|
|
@ -7,8 +7,6 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
Session::Session() {
|
Session::Session() {}
|
||||||
}
|
Session::~Session() {}
|
||||||
Session::~Session() {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,10 +12,8 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
SharedMemory::SharedMemory() {
|
SharedMemory::SharedMemory() {}
|
||||||
}
|
SharedMemory::~SharedMemory() {}
|
||||||
SharedMemory::~SharedMemory() {
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u32 size,
|
SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u32 size,
|
||||||
MemoryPermission permissions,
|
MemoryPermission permissions,
|
||||||
|
|
|
@ -61,10 +61,8 @@ inline static u32 const NewThreadId() {
|
||||||
return next_thread_id++;
|
return next_thread_id++;
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread::Thread() {
|
Thread::Thread() {}
|
||||||
}
|
Thread::~Thread() {}
|
||||||
Thread::~Thread() {
|
|
||||||
}
|
|
||||||
|
|
||||||
Thread* GetCurrentThread() {
|
Thread* GetCurrentThread() {
|
||||||
return current_thread;
|
return current_thread;
|
||||||
|
|
|
@ -20,10 +20,8 @@ static int timer_callback_event_type;
|
||||||
// us to simply use a pool index or similar.
|
// us to simply use a pool index or similar.
|
||||||
static Kernel::HandleTable timer_callback_handle_table;
|
static Kernel::HandleTable timer_callback_handle_table;
|
||||||
|
|
||||||
Timer::Timer() {
|
Timer::Timer() {}
|
||||||
}
|
Timer::~Timer() {}
|
||||||
Timer::~Timer() {
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedPtr<Timer> Timer::Create(ResetType reset_type, std::string name) {
|
SharedPtr<Timer> Timer::Create(ResetType reset_type, std::string name) {
|
||||||
SharedPtr<Timer> timer(new Timer);
|
SharedPtr<Timer> timer(new Timer);
|
||||||
|
@ -103,7 +101,6 @@ void TimersInit() {
|
||||||
timer_callback_event_type = CoreTiming::RegisterEvent("TimerCallback", TimerCallback);
|
timer_callback_event_type = CoreTiming::RegisterEvent("TimerCallback", TimerCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimersShutdown() {
|
void TimersShutdown() {}
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -213,8 +213,7 @@ union ResultCode {
|
||||||
// error
|
// error
|
||||||
BitField<31, 1, u32> is_error;
|
BitField<31, 1, u32> is_error;
|
||||||
|
|
||||||
explicit ResultCode(u32 raw) : raw(raw) {
|
explicit ResultCode(u32 raw) : raw(raw) {}
|
||||||
}
|
|
||||||
ResultCode(ErrorDescription description_, ErrorModule module_, ErrorSummary summary_,
|
ResultCode(ErrorDescription description_, ErrorModule module_, ErrorSummary summary_,
|
||||||
ErrorLevel level_)
|
ErrorLevel level_)
|
||||||
: raw(0) {
|
: raw(0) {
|
||||||
|
|
|
@ -186,8 +186,7 @@ void Init() {
|
||||||
AddService(new AM_U_Interface);
|
AddService(new AM_U_Interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shutdown() {
|
void Shutdown() {}
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace AM
|
} // namespace AM
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/hle/service/am/am.h"
|
|
||||||
#include "core/hle/service/am/am_app.h"
|
#include "core/hle/service/am/am_app.h"
|
||||||
|
#include "core/hle/service/am/am.h"
|
||||||
|
|
||||||
namespace Service {
|
namespace Service {
|
||||||
namespace AM {
|
namespace AM {
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/hle/service/am/am.h"
|
|
||||||
#include "core/hle/service/am/am_net.h"
|
#include "core/hle/service/am/am_net.h"
|
||||||
|
#include "core/hle/service/am/am.h"
|
||||||
|
|
||||||
namespace Service {
|
namespace Service {
|
||||||
namespace AM {
|
namespace AM {
|
||||||
|
|
|
@ -2,33 +2,35 @@
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/hle/service/am/am.h"
|
|
||||||
#include "core/hle/service/am/am_sys.h"
|
#include "core/hle/service/am/am_sys.h"
|
||||||
|
#include "core/hle/service/am/am.h"
|
||||||
|
|
||||||
namespace Service {
|
namespace Service {
|
||||||
namespace AM {
|
namespace AM {
|
||||||
|
|
||||||
const Interface::FunctionInfo FunctionTable[] = {{0x00010040, GetTitleCount, "GetTitleCount"},
|
const Interface::FunctionInfo FunctionTable[] = {
|
||||||
{0x00020082, GetTitleList, "GetTitleList"},
|
{0x00010040, GetTitleCount, "GetTitleCount"},
|
||||||
{0x00030084, GetTitleInfo, "GetTitleInfo"},
|
{0x00020082, GetTitleList, "GetTitleList"},
|
||||||
{0x000400C0, nullptr, "DeleteApplicationTitle"},
|
{0x00030084, GetTitleInfo, "GetTitleInfo"},
|
||||||
{0x000500C0, nullptr, "GetTitleProductCode"},
|
{0x000400C0, nullptr, "DeleteApplicationTitle"},
|
||||||
{0x000600C0, nullptr, "GetTitleExtDataId"},
|
{0x000500C0, nullptr, "GetTitleProductCode"},
|
||||||
{0x00070080, DeleteTicket, "DeleteTicket"},
|
{0x000600C0, nullptr, "GetTitleExtDataId"},
|
||||||
{0x00080000, GetTicketCount, "GetTicketCount"},
|
{0x00070080, DeleteTicket, "DeleteTicket"},
|
||||||
{0x00090082, GetTicketList, "GetTicketList"},
|
{0x00080000, GetTicketCount, "GetTicketCount"},
|
||||||
{0x000A0000, nullptr, "GetDeviceID"},
|
{0x00090082, GetTicketList, "GetTicketList"},
|
||||||
{0x000D0084, nullptr, "GetPendingTitleInfo"},
|
{0x000A0000, nullptr, "GetDeviceID"},
|
||||||
{0x000E00C0, nullptr, "DeletePendingTitle"},
|
{0x000D0084, nullptr, "GetPendingTitleInfo"},
|
||||||
{0x00140040, nullptr, "FinalizePendingTitles"},
|
{0x000E00C0, nullptr, "DeletePendingTitle"},
|
||||||
{0x00150040, nullptr, "DeleteAllPendingTitles"},
|
{0x00140040, nullptr, "FinalizePendingTitles"},
|
||||||
{0x00180080, nullptr, "InitializeTitleDatabase"},
|
{0x00150040, nullptr, "DeleteAllPendingTitles"},
|
||||||
{0x00190040, nullptr, "ReloadDBS"},
|
{0x00180080, nullptr, "InitializeTitleDatabase"},
|
||||||
{0x001A00C0, nullptr, "GetDSiWareExportSize"},
|
{0x00190040, nullptr, "ReloadDBS"},
|
||||||
{0x001B0144, nullptr, "ExportDSiWare"},
|
{0x001A00C0, nullptr, "GetDSiWareExportSize"},
|
||||||
{0x001C0084, nullptr, "ImportDSiWare"},
|
{0x001B0144, nullptr, "ExportDSiWare"},
|
||||||
{0x00230080, nullptr, "GetPendingTitleCount"},
|
{0x001C0084, nullptr, "ImportDSiWare"},
|
||||||
{0x002400C2, nullptr, "GetPendingTitleList"}};
|
{0x00230080, nullptr, "GetPendingTitleCount"},
|
||||||
|
{0x002400C2, nullptr, "GetPendingTitleList"},
|
||||||
|
};
|
||||||
|
|
||||||
AM_SYS_Interface::AM_SYS_Interface() {
|
AM_SYS_Interface::AM_SYS_Interface() {
|
||||||
Register(FunctionTable);
|
Register(FunctionTable);
|
||||||
|
|
|
@ -2,46 +2,48 @@
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/hle/service/am/am.h"
|
|
||||||
#include "core/hle/service/am/am_u.h"
|
#include "core/hle/service/am/am_u.h"
|
||||||
|
#include "core/hle/service/am/am.h"
|
||||||
|
|
||||||
namespace Service {
|
namespace Service {
|
||||||
namespace AM {
|
namespace AM {
|
||||||
|
|
||||||
const Interface::FunctionInfo FunctionTable[] = {{0x00010040, GetTitleCount, "GetTitleCount"},
|
const Interface::FunctionInfo FunctionTable[] = {
|
||||||
{0x00020082, GetTitleList, "GetTitleList"},
|
{0x00010040, GetTitleCount, "GetTitleCount"},
|
||||||
{0x00030084, GetTitleInfo, "GetTitleInfo"},
|
{0x00020082, GetTitleList, "GetTitleList"},
|
||||||
{0x000400C0, nullptr, "DeleteApplicationTitle"},
|
{0x00030084, GetTitleInfo, "GetTitleInfo"},
|
||||||
{0x000500C0, nullptr, "GetTitleProductCode"},
|
{0x000400C0, nullptr, "DeleteApplicationTitle"},
|
||||||
{0x000600C0, nullptr, "GetTitleExtDataId"},
|
{0x000500C0, nullptr, "GetTitleProductCode"},
|
||||||
{0x00070080, DeleteTicket, "DeleteTicket"},
|
{0x000600C0, nullptr, "GetTitleExtDataId"},
|
||||||
{0x00080000, GetTicketCount, "GetTicketCount"},
|
{0x00070080, DeleteTicket, "DeleteTicket"},
|
||||||
{0x00090082, GetTicketList, "GetTicketList"},
|
{0x00080000, GetTicketCount, "GetTicketCount"},
|
||||||
{0x000A0000, nullptr, "GetDeviceID"},
|
{0x00090082, GetTicketList, "GetTicketList"},
|
||||||
{0x000D0084, nullptr, "GetPendingTitleInfo"},
|
{0x000A0000, nullptr, "GetDeviceID"},
|
||||||
{0x000E00C0, nullptr, "DeletePendingTitle"},
|
{0x000D0084, nullptr, "GetPendingTitleInfo"},
|
||||||
{0x00140040, nullptr, "FinalizePendingTitles"},
|
{0x000E00C0, nullptr, "DeletePendingTitle"},
|
||||||
{0x00150040, nullptr, "DeleteAllPendingTitles"},
|
{0x00140040, nullptr, "FinalizePendingTitles"},
|
||||||
{0x00180080, nullptr, "InitializeTitleDatabase"},
|
{0x00150040, nullptr, "DeleteAllPendingTitles"},
|
||||||
{0x00190040, nullptr, "ReloadDBS"},
|
{0x00180080, nullptr, "InitializeTitleDatabase"},
|
||||||
{0x001A00C0, nullptr, "GetDSiWareExportSize"},
|
{0x00190040, nullptr, "ReloadDBS"},
|
||||||
{0x001B0144, nullptr, "ExportDSiWare"},
|
{0x001A00C0, nullptr, "GetDSiWareExportSize"},
|
||||||
{0x001C0084, nullptr, "ImportDSiWare"},
|
{0x001B0144, nullptr, "ExportDSiWare"},
|
||||||
{0x00230080, nullptr, "TitleIDListGetTotal2"},
|
{0x001C0084, nullptr, "ImportDSiWare"},
|
||||||
{0x002400C2, nullptr, "GetTitleIDList2"},
|
{0x00230080, nullptr, "TitleIDListGetTotal2"},
|
||||||
{0x04010080, nullptr, "InstallFIRM"},
|
{0x002400C2, nullptr, "GetTitleIDList2"},
|
||||||
{0x04020040, nullptr, "StartInstallCIADB0"},
|
{0x04010080, nullptr, "InstallFIRM"},
|
||||||
{0x04030000, nullptr, "StartInstallCIADB1"},
|
{0x04020040, nullptr, "StartInstallCIADB0"},
|
||||||
{0x04040002, nullptr, "AbortCIAInstall"},
|
{0x04030000, nullptr, "StartInstallCIADB1"},
|
||||||
{0x04050002, nullptr, "CloseCIAFinalizeInstall"},
|
{0x04040002, nullptr, "AbortCIAInstall"},
|
||||||
{0x04060002, nullptr, "CloseCIA"},
|
{0x04050002, nullptr, "CloseCIAFinalizeInstall"},
|
||||||
{0x040700C2, nullptr, "FinalizeTitlesInstall"},
|
{0x04060002, nullptr, "CloseCIA"},
|
||||||
{0x04080042, nullptr, "GetCiaFileInfo"},
|
{0x040700C2, nullptr, "FinalizeTitlesInstall"},
|
||||||
{0x040E00C2, nullptr, "InstallTitlesFinish"},
|
{0x04080042, nullptr, "GetCiaFileInfo"},
|
||||||
{0x040F0000, nullptr, "InstallNATIVEFIRM"},
|
{0x040E00C2, nullptr, "InstallTitlesFinish"},
|
||||||
{0x041000C0, nullptr, "DeleteTitle"},
|
{0x040F0000, nullptr, "InstallNATIVEFIRM"},
|
||||||
{0x04120000, nullptr, "Initialize"},
|
{0x041000C0, nullptr, "DeleteTitle"},
|
||||||
{0x041700C0, nullptr, "MigrateAGBtoSAV"}};
|
{0x04120000, nullptr, "Initialize"},
|
||||||
|
{0x041700C0, nullptr, "MigrateAGBtoSAV"},
|
||||||
|
};
|
||||||
|
|
||||||
AM_U_Interface::AM_U_Interface() {
|
AM_U_Interface::AM_U_Interface() {
|
||||||
Register(FunctionTable);
|
Register(FunctionTable);
|
||||||
|
|
|
@ -90,10 +90,8 @@ void GetSharedFont(Service::Interface* self) {
|
||||||
cmd_buff[0] = IPC::MakeHeader(0x44, 2, 2);
|
cmd_buff[0] = IPC::MakeHeader(0x44, 2, 2);
|
||||||
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
|
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
|
||||||
// Since the SharedMemory interface doesn't provide the address at which the memory was
|
// Since the SharedMemory interface doesn't provide the address at which the memory was
|
||||||
// allocated,
|
// allocated, the real APT service calculates this address by scanning the entire address space
|
||||||
// the real APT service calculates this address by scanning the entire address space (using
|
// (using svcQueryMemory) and searches for an allocation of the same size as the Shared Font.
|
||||||
// svcQueryMemory)
|
|
||||||
// and searches for an allocation of the same size as the Shared Font.
|
|
||||||
cmd_buff[2] = target_address;
|
cmd_buff[2] = target_address;
|
||||||
cmd_buff[3] = IPC::CopyHandleDesc();
|
cmd_buff[3] = IPC::CopyHandleDesc();
|
||||||
cmd_buff[4] = Kernel::g_handle_table.Create(shared_font_mem).MoveFrom();
|
cmd_buff[4] = Kernel::g_handle_table.Create(shared_font_mem).MoveFrom();
|
||||||
|
|
|
@ -183,12 +183,10 @@ void GetAppletInfo(Service::Interface* self);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* APT::IsRegistered service function. This returns whether the specified AppID is registered with
|
* APT::IsRegistered service function. This returns whether the specified AppID is registered with
|
||||||
* NS yet.
|
* NS yet. An AppID is "registered" once the process associated with the AppID uses APT:Enable. Home
|
||||||
* An AppID is "registered" once the process associated with the AppID uses APT:Enable. Home Menu
|
* Menu uses this command to determine when the launched process is running and to determine when to
|
||||||
* uses this
|
* stop using GSP, etc., while displaying the "Nintendo 3DS" loading screen.
|
||||||
* command to determine when the launched process is running and to determine when to stop using GSP
|
*
|
||||||
* etc,
|
|
||||||
* while displaying the "Nintendo 3DS" loading screen.
|
|
||||||
* Inputs:
|
* Inputs:
|
||||||
* 1 : AppID
|
* 1 : AppID
|
||||||
* Outputs:
|
* Outputs:
|
||||||
|
@ -264,10 +262,10 @@ void GlanceParameter(Service::Interface* self);
|
||||||
* (same flag cleared by APT:ReceiveParameter).
|
* (same flag cleared by APT:ReceiveParameter).
|
||||||
* Inputs:
|
* Inputs:
|
||||||
* 1 : Flag, when non-zero NS will compare the word after this one with a field in the NS
|
* 1 : Flag, when non-zero NS will compare the word after this one with a field in the NS
|
||||||
* state.
|
* state.
|
||||||
* 2 : Unknown, this is the same as the first unknown field returned by APT:ReceiveParameter.
|
* 2 : Unknown, this is the same as the first unknown field returned by APT:ReceiveParameter.
|
||||||
* 3 : Flag, when non-zero NS will compare the word after this one with a field in the NS
|
* 3 : Flag, when non-zero NS will compare the word after this one with a field in the NS
|
||||||
* state.
|
* state.
|
||||||
* 4 : AppID
|
* 4 : AppID
|
||||||
* Outputs:
|
* Outputs:
|
||||||
* 0 : Return header
|
* 0 : Return header
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/hle/service/apt/apt.h"
|
|
||||||
#include "core/hle/service/apt/apt_a.h"
|
#include "core/hle/service/apt/apt_a.h"
|
||||||
|
#include "core/hle/service/apt/apt.h"
|
||||||
|
|
||||||
namespace Service {
|
namespace Service {
|
||||||
namespace APT {
|
namespace APT {
|
||||||
|
@ -36,7 +36,8 @@ const Interface::FunctionInfo FunctionTable[] = {
|
||||||
{0x00550040, SetScreenCapPostPermission, "SetScreenCapPostPermission"},
|
{0x00550040, SetScreenCapPostPermission, "SetScreenCapPostPermission"},
|
||||||
{0x00560000, GetScreenCapPostPermission, "GetScreenCapPostPermission"},
|
{0x00560000, GetScreenCapPostPermission, "GetScreenCapPostPermission"},
|
||||||
{0x01010000, CheckNew3DSApp, "CheckNew3DSApp"},
|
{0x01010000, CheckNew3DSApp, "CheckNew3DSApp"},
|
||||||
{0x01020000, CheckNew3DS, "CheckNew3DS"}};
|
{0x01020000, CheckNew3DS, "CheckNew3DS"},
|
||||||
|
};
|
||||||
|
|
||||||
APT_A_Interface::APT_A_Interface() {
|
APT_A_Interface::APT_A_Interface() {
|
||||||
Register(FunctionTable);
|
Register(FunctionTable);
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/hle/service/apt/apt.h"
|
|
||||||
#include "core/hle/service/apt/apt_s.h"
|
#include "core/hle/service/apt/apt_s.h"
|
||||||
|
#include "core/hle/service/apt/apt.h"
|
||||||
|
|
||||||
namespace Service {
|
namespace Service {
|
||||||
namespace APT {
|
namespace APT {
|
||||||
|
@ -96,7 +96,8 @@ const Interface::FunctionInfo FunctionTable[] = {
|
||||||
{0x00560000, GetScreenCapPostPermission, "GetScreenCapPostPermission"},
|
{0x00560000, GetScreenCapPostPermission, "GetScreenCapPostPermission"},
|
||||||
{0x00580002, nullptr, "GetProgramID"},
|
{0x00580002, nullptr, "GetProgramID"},
|
||||||
{0x01010000, CheckNew3DSApp, "CheckNew3DSApp"},
|
{0x01010000, CheckNew3DSApp, "CheckNew3DSApp"},
|
||||||
{0x01020000, CheckNew3DS, "CheckNew3DS"}};
|
{0x01020000, CheckNew3DS, "CheckNew3DS"},
|
||||||
|
};
|
||||||
|
|
||||||
APT_S_Interface::APT_S_Interface() {
|
APT_S_Interface::APT_S_Interface() {
|
||||||
Register(FunctionTable);
|
Register(FunctionTable);
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/hle/service/apt/apt.h"
|
|
||||||
#include "core/hle/service/apt/apt_u.h"
|
#include "core/hle/service/apt/apt_u.h"
|
||||||
|
#include "core/hle/service/apt/apt.h"
|
||||||
|
|
||||||
namespace Service {
|
namespace Service {
|
||||||
namespace APT {
|
namespace APT {
|
||||||
|
@ -96,7 +96,8 @@ const Interface::FunctionInfo FunctionTable[] = {
|
||||||
{0x00560000, GetScreenCapPostPermission, "GetScreenCapPostPermission"},
|
{0x00560000, GetScreenCapPostPermission, "GetScreenCapPostPermission"},
|
||||||
{0x00580002, nullptr, "GetProgramID"},
|
{0x00580002, nullptr, "GetProgramID"},
|
||||||
{0x01010000, CheckNew3DSApp, "CheckNew3DSApp"},
|
{0x01010000, CheckNew3DSApp, "CheckNew3DSApp"},
|
||||||
{0x01020000, CheckNew3DS, "CheckNew3DS"}};
|
{0x01020000, CheckNew3DS, "CheckNew3DS"},
|
||||||
|
};
|
||||||
|
|
||||||
APT_U_Interface::APT_U_Interface() {
|
APT_U_Interface::APT_U_Interface() {
|
||||||
Register(FunctionTable);
|
Register(FunctionTable);
|
||||||
|
|
|
@ -17,8 +17,7 @@ void Init() {
|
||||||
AddService(new BOSS_U_Interface);
|
AddService(new BOSS_U_Interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shutdown() {
|
void Shutdown() {}
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace BOSS
|
} // namespace BOSS
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue