Implement GetReleasedAudioOutBufferAuto properly (#206)

* Implement GetReleasedAudioOutBufferAuto properly

* Also implement AppendAudioOutBufferAuto properly
This commit is contained in:
Lordmau5 2018-06-30 17:53:04 +02:00 committed by gdkchan
parent 2f25b34941
commit e913d56fdc

View file

@ -31,8 +31,8 @@ namespace Ryujinx.HLE.OsHle.Services.Aud
{ 4, RegisterBufferEvent }, { 4, RegisterBufferEvent },
{ 5, GetReleasedAudioOutBuffer }, { 5, GetReleasedAudioOutBuffer },
{ 6, ContainsAudioOutBuffer }, { 6, ContainsAudioOutBuffer },
{ 7, AppendAudioOutBufferEx }, { 7, AppendAudioOutBufferAuto },
{ 8, GetReleasedAudioOutBufferEx } { 8, GetReleasedAudioOutBufferAuto }
}; };
this.AudioOut = AudioOut; this.AudioOut = AudioOut;
@ -63,19 +63,7 @@ namespace Ryujinx.HLE.OsHle.Services.Aud
public long AppendAudioOutBuffer(ServiceCtx Context) public long AppendAudioOutBuffer(ServiceCtx Context)
{ {
long Tag = Context.RequestData.ReadInt64(); return AppendAudioOutBufferImpl(Context, Context.Request.SendBuff[0].Position);
AudioOutData Data = AMemoryHelper.Read<AudioOutData>(
Context.Memory,
Context.Request.SendBuff[0].Position);
byte[] Buffer = Context.Memory.ReadBytes(
Data.SampleBufferPtr,
Data.SampleBufferSize);
AudioOut.AppendBuffer(Track, Tag, Buffer);
return 0;
} }
public long RegisterBufferEvent(ServiceCtx Context) public long RegisterBufferEvent(ServiceCtx Context)
@ -92,6 +80,51 @@ namespace Ryujinx.HLE.OsHle.Services.Aud
long Position = Context.Request.ReceiveBuff[0].Position; long Position = Context.Request.ReceiveBuff[0].Position;
long Size = Context.Request.ReceiveBuff[0].Size; long Size = Context.Request.ReceiveBuff[0].Size;
return GetReleasedAudioOutBufferImpl(Context, Position, Size);
}
public long ContainsAudioOutBuffer(ServiceCtx Context)
{
long Tag = Context.RequestData.ReadInt64();
Context.ResponseData.Write(AudioOut.ContainsBuffer(Track, Tag) ? 1 : 0);
return 0;
}
public long AppendAudioOutBufferAuto(ServiceCtx Context)
{
(long Position, long Size) = Context.Request.GetBufferType0x21();
return AppendAudioOutBufferImpl(Context, Position);
}
public long AppendAudioOutBufferImpl(ServiceCtx Context, long Position)
{
long Tag = Context.RequestData.ReadInt64();
AudioOutData Data = AMemoryHelper.Read<AudioOutData>(
Context.Memory,
Position);
byte[] Buffer = Context.Memory.ReadBytes(
Data.SampleBufferPtr,
Data.SampleBufferSize);
AudioOut.AppendBuffer(Track, Tag, Buffer);
return 0;
}
public long GetReleasedAudioOutBufferAuto(ServiceCtx Context)
{
(long Position, long Size) = Context.Request.GetBufferType0x22();
return GetReleasedAudioOutBufferImpl(Context, Position, Size);
}
public long GetReleasedAudioOutBufferImpl(ServiceCtx Context, long Position, long Size)
{
uint Count = (uint)((ulong)Size >> 3); uint Count = (uint)((ulong)Size >> 3);
long[] ReleasedBuffers = AudioOut.GetReleasedBuffers(Track, (int)Count); long[] ReleasedBuffers = AudioOut.GetReleasedBuffers(Track, (int)Count);
@ -113,29 +146,6 @@ namespace Ryujinx.HLE.OsHle.Services.Aud
return 0; return 0;
} }
public long ContainsAudioOutBuffer(ServiceCtx Context)
{
long Tag = Context.RequestData.ReadInt64();
Context.ResponseData.Write(AudioOut.ContainsBuffer(Track, Tag) ? 1 : 0);
return 0;
}
public long AppendAudioOutBufferEx(ServiceCtx Context)
{
Context.Ns.Log.PrintStub(LogClass.ServiceAudio, "Stubbed.");
return 0;
}
public long GetReleasedAudioOutBufferEx(ServiceCtx Context)
{
Context.Ns.Log.PrintStub(LogClass.ServiceAudio, "Stubbed.");
return 0;
}
public void Dispose() public void Dispose()
{ {
Dispose(true); Dispose(true);