Skip to content

Commit 105ad60

Browse files
author
David Khristepher Santos
committed
Merge branch 'cdaudio'
2 parents 77f69e8 + 52dbe26 commit 105ad60

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+3169
-1378
lines changed

PSXPackager.Audio/CDAudioPlayer.cs

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using NAudio.Wave;
22
using PSXPackager.Common.Cue;
3+
using System;
34

45
namespace PSXPackager.Audio
56
{
67
public class CDAudioPlayerStopped
78
{
9+
public CueTrack? Track { get; set; }
810
public Exception? Exception { get; set; }
911
}
1012

@@ -78,20 +80,36 @@ public void PlayCueTrack(CueTrack track)
7880
cts?.Cancel();
7981
resetEvent.WaitOne(100);
8082
cts = new CancellationTokenSource();
83+
8184
PlayCueTrack(track, cts.Token);
8285
}
8386

8487
public void PlayCueTrack(CueTrack track, CancellationToken cancellationToken)
8588
{
8689
var binPath = track.FileEntry.FileName;
90+
bool isPbp = false;
8791

88-
if (!Path.IsPathFullyQualified(binPath))
92+
if (FileAbstraction.TryGetPbpDiscEntryFromUri(binPath, out var discEntry))
8993
{
90-
binPath = Path.Combine(Path.GetDirectoryName(track.FileEntry.CueFile.Path), binPath);
94+
isPbp = true;
95+
}
96+
else
97+
{
98+
if (!Path.IsPathFullyQualified(binPath))
99+
{
100+
binPath = Path.Combine(Path.GetDirectoryName(track.FileEntry.CueFile.Path), binPath);
101+
}
91102
}
92103

93-
_buffer.ClearBuffer();
94-
_waveOutEvent.Play();
104+
long GetFileSize()
105+
{
106+
return isPbp ? discEntry!.IsoSize : new FileInfo(binPath).Length;
107+
}
108+
109+
Stream GetStream()
110+
{
111+
return isPbp ? discEntry!.GetDiscStream() : File.OpenRead(binPath);
112+
}
95113

96114
// Skip pre-gap
97115
var startIndex = track.Indexes.First(i => i.Number == 1);
@@ -103,21 +121,27 @@ public void PlayCueTrack(CueTrack track, CancellationToken cancellationToken)
103121
endSector = track.Next.Indexes.First(i => i.Number == 1).Position.ToSector();
104122
else
105123
{
106-
var fileSize = FileAbstraction.GetFileSizeFromUri(binPath);
124+
var fileSize = GetFileSize();
107125
endSector = (int)(fileSize / SectorSize);
108126
}
109127

128+
_buffer.ClearBuffer();
129+
_waveOutEvent.Play();
130+
131+
Play(GetStream(), startSector, endSector, cancellationToken);
132+
}
133+
134+
private void Play(Stream stream, int startSector, int endSector, CancellationToken cancellationToken)
135+
{
110136
Task.Run(() =>
111137
{
112-
using var fs = FileAbstraction.GetStreamFromUri(binPath);
113-
114-
fs.Seek((long)startSector * SectorSize, SeekOrigin.Begin);
138+
stream.Seek((long)startSector * SectorSize, SeekOrigin.Begin);
115139

116140
byte[] sector = new byte[SectorSize];
117141
int currentSector = startSector;
118142

119143
while (currentSector < endSector &&
120-
fs.Read(sector, 0, sector.Length) == sector.Length)
144+
stream.Read(sector, 0, sector.Length) == sector.Length)
121145
{
122146
while (_buffer.BufferedBytes > _buffer.BufferLength - sector.Length)
123147
{
@@ -148,12 +172,9 @@ public void PlayCueTrack(CueTrack track, CancellationToken cancellationToken)
148172
}
149173

150174
Stop();
151-
resetEvent.Set();
152175
});
153-
154176
}
155177

156-
157178
public void Dispose()
158179
{
159180
if (_waveOutEvent.PlaybackState == PlaybackState.Playing)

PSXPackager.Audio/FileAbstraction.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace PSXPackager.Audio;
1313
/// PBP containers as if they were standalone files.</remarks>
1414
public static class FileAbstraction
1515
{
16-
public static bool TryGetPbpDiscEntryFromUri(string uri, out PbpDiscEntry discEntry)
16+
public static bool TryGetPbpDiscEntryFromUri(string uri, out PbpDiscEntry? discEntry)
1717
{
1818
var match = IsPbpUri(uri);
1919
if (match.Success)
@@ -33,7 +33,7 @@ public static bool TryGetPbpDiscEntryFromUri(string uri, out PbpDiscEntry discEn
3333

3434
public static Match IsPbpUri(string uri)
3535
{
36-
var pbpRegex = new Regex("//pbp/(.*\\.pbp)/(\\d)", RegexOptions.IgnoreCase);
36+
var pbpRegex = new Regex("pbp://(?<pbp>.*\\.pbp)/disc(?<disc>\\d)", RegexOptions.IgnoreCase);
3737
var match = pbpRegex.Match(uri);
3838
return match;
3939
}
@@ -45,11 +45,11 @@ public static long GetFileSizeFromUri(string uri)
4545
{
4646
try
4747
{
48-
return discEntry.IsoSize;
48+
return discEntry!.IsoSize;
4949
}
5050
finally
5151
{
52-
discEntry.Dispose();
52+
discEntry?.Dispose();
5353
}
5454
}
5555
else

PSXPackager.Common/TOCHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ public static IndexPosition PositionFromFrames(long frames)
6969
return position;
7070
}
7171

72-
public static CueFile TOCtoCUE(List<TOCEntry> tocEntries, string dataPath)
72+
public static CueFile TOCtoCUE(List<TOCEntry> tocEntries, string fileName)
7373
{
7474
var cueFile = new CueFile();
7575

7676
var cueFileEntry = new CueFileEntry()
7777
{
7878
CueFile = cueFile,
79-
FileName = dataPath,
79+
FileName = fileName,
8080
Tracks = new List<CueTrack>(),
8181
FileType = FileTypes.BINARY
8282
};
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
using System.Collections.ObjectModel;
2+
using System;
3+
using System.IO;
4+
using System.Windows;
5+
using System.Windows.Media.Imaging;
6+
using Microsoft.Win32;
7+
using System.Xml.Serialization;
8+
using Popstation.Pbp;
9+
using PSXPackagerGUI.Models.Resource;
10+
using PSXPackagerGUI.Pages;
11+
using PSXPackagerGUI.Templates;
12+
using ImageLayer = PSXPackagerGUI.Models.Resource.ImageLayer;
13+
using Layer = PSXPackagerGUI.Models.Resource.Layer;
14+
15+
namespace PSXPackagerGUI.Common;
16+
17+
public class ResourceHelper
18+
{
19+
20+
public static void LoadTemplate(ResourceModel resource, string filename, bool isDefault = false)
21+
{
22+
switch (resource.Type)
23+
{
24+
case ResourceType.ICON0:
25+
case ResourceType.BOOT:
26+
case ResourceType.PIC1:
27+
case ResourceType.PIC0:
28+
{
29+
XmlSerializer serializer = new XmlSerializer(typeof(Resource));
30+
31+
var basePath = Path.GetDirectoryName(filename);
32+
33+
using (FileStream stream = File.OpenRead(filename))
34+
{
35+
try
36+
{
37+
var xmlResource = (Resource)serializer.Deserialize(stream)!;
38+
var resourceTemplate = xmlResource.ToResourceTemplate(basePath!);
39+
if (resourceTemplate.ResourceType != resource.Type)
40+
{
41+
return;
42+
}
43+
resource.Composite.Clear();
44+
resource.Composite.Layers = new ObservableCollection<Layer>(resourceTemplate.Layers);
45+
resource.RefreshIcon();
46+
}
47+
finally
48+
{
49+
50+
}
51+
}
52+
resource.HasResource = true;
53+
break;
54+
}
55+
}
56+
}
57+
58+
public static void LoadResource(ResourceModel resource, string filename, bool isDefault = false)
59+
{
60+
switch (resource.Type)
61+
{
62+
case ResourceType.ICON0:
63+
case ResourceType.BOOT:
64+
case ResourceType.PIC1:
65+
case ResourceType.PIC0:
66+
{
67+
resource.Composite.Clear();
68+
69+
try
70+
{
71+
var appPath = ApplicationInfo.AppPath;
72+
73+
using var fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
74+
75+
BitmapSource image = ImageProcessing.GetBitmapImage(fileStream);
76+
77+
switch (resource.Type)
78+
{
79+
case ResourceType.ICON0:
80+
{
81+
//image = ImageProcessing.Resize(image, 80, 80);
82+
83+
84+
if (ServiceLocator.Settings.GenerateIconFrame)
85+
{
86+
var alphaMaskUri = Path.Combine(appPath, "Resources", "alpha.png");
87+
using var maskStream = new FileStream(alphaMaskUri, FileMode.Open, FileAccess.Read);
88+
resource.Composite.SetAplhaMask(ImageProcessing.GetBitmapImage(maskStream));
89+
90+
resource.Composite.Layers.Add(new ImageLayer(image, "image", alphaMaskUri));
91+
92+
var overlayUri = Path.Combine(appPath, "Resources", "overlay.png");
93+
using var frameStream = new FileStream(overlayUri, FileMode.Open, FileAccess.Read);
94+
resource.Composite.Layers.Add(new ImageLayer(ImageProcessing.GetBitmapImage(frameStream), "frame", overlayUri));
95+
}
96+
else
97+
{
98+
resource.Composite.Layers.Add(new ImageLayer(image, "image", filename));
99+
}
100+
101+
102+
break;
103+
}
104+
case ResourceType.PIC0:
105+
{
106+
//image = ImageProcessing.Resize(image, 310, 180);
107+
108+
resource.Composite.Layers.Add(new ImageLayer(image, "image", filename));
109+
break;
110+
}
111+
case ResourceType.PIC1:
112+
case ResourceType.BOOT:
113+
{
114+
//image = ImageProcessing.Resize(image, 480, 272);
115+
116+
resource.Composite.Layers.Add(new ImageLayer(image, "image", filename));
117+
break;
118+
}
119+
}
120+
resource.HasResource = true;
121+
resource.SourceUrl = filename;
122+
resource.RefreshIcon();
123+
}
124+
catch (Exception e)
125+
{
126+
}
127+
128+
break;
129+
}
130+
default:
131+
{
132+
try
133+
{
134+
using var fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
135+
resource.CopyFromStream(fileStream);
136+
resource.HasResource = true;
137+
resource.SourceUrl = filename;
138+
}
139+
catch (Exception e)
140+
{
141+
}
142+
break;
143+
}
144+
}
145+
146+
}
147+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using PSXPackagerGUI.Models;
2+
3+
namespace PSXPackagerGUI.Common;
4+
5+
public static class ServiceLocator
6+
{
7+
public static SettingsModel Settings { get; set; }
8+
}

PSXPackagerGUI/Common/SimpleMapper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Linq;
2+
using System.Runtime;
23

34
namespace PSXPackagerGUI.Common
45
{

PSXPackagerGUI/Controls/AutoDisableImage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ protected override void OnRender(DrawingContext dc)
3737

3838
}
3939

40-
dc.DrawImage(bitmapSource, new Rect(new Point(), RenderSize));
40+
dc.DrawImage(bitmapSource, new Rect(new System.Windows.Point(), RenderSize));
4141
}
4242
}
4343
}

0 commit comments

Comments
 (0)