From bb3a73ff88895f72c99b7cf14a7bb708bfa8af80 Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Sat, 3 Apr 2021 01:29:43 +0300 Subject: [PATCH] Cocoa GBS Player --- Cocoa/Document.h | 8 +++ Cocoa/Document.m | 84 +++++++++++++++++++++++++++++-- Cocoa/GBS.xib | 113 ++++++++++++++++++++++++++++++++++++++++++ Cocoa/Info.plist | 41 ++++++++++++++- Cocoa/Next.png | Bin 0 -> 1676 bytes Cocoa/Next@2x.png | Bin 0 -> 1787 bytes Cocoa/Pause.png | Bin 0 -> 1614 bytes Cocoa/Pause@2x.png | Bin 0 -> 4436 bytes Cocoa/Play.png | Bin 0 -> 4442 bytes Cocoa/Play@2x.png | Bin 0 -> 4527 bytes Cocoa/Previous.png | Bin 0 -> 1664 bytes Cocoa/Previous@2x.png | Bin 0 -> 4569 bytes Cocoa/Rewind.png | Bin 0 -> 1664 bytes Cocoa/Rewind@2x.png | Bin 0 -> 4515 bytes Core/display.c | 4 +- 15 files changed, 243 insertions(+), 7 deletions(-) create mode 100644 Cocoa/GBS.xib create mode 100644 Cocoa/Next.png create mode 100644 Cocoa/Next@2x.png create mode 100644 Cocoa/Pause.png create mode 100644 Cocoa/Pause@2x.png create mode 100644 Cocoa/Play.png create mode 100644 Cocoa/Play@2x.png create mode 100644 Cocoa/Previous.png create mode 100644 Cocoa/Previous@2x.png create mode 100644 Cocoa/Rewind.png create mode 100644 Cocoa/Rewind@2x.png diff --git a/Cocoa/Document.h b/Cocoa/Document.h index b6516467..e0a3aa3a 100644 --- a/Cocoa/Document.h +++ b/Cocoa/Document.h @@ -39,6 +39,14 @@ @property (nonatomic, strong) IBOutlet GBCheatWindowController *cheatWindowController; @property (nonatomic, readonly) Document *partner; @property (nonatomic, readonly) bool isSlave; +@property (strong) IBOutlet NSView *gbsPlayerView; +@property (strong) IBOutlet NSTextField *gbsTitle; +@property (strong) IBOutlet NSTextField *gbsAuthor; +@property (strong) IBOutlet NSTextField *gbsCopyright; +@property (strong) IBOutlet NSPopUpButton *gbsTracks; +@property (strong) IBOutlet NSButton *gbsPlayPauseButton; +@property (strong) IBOutlet NSButton *gbsRewindButton; +@property (strong) IBOutlet NSSegmentedControl *gbsNextPrevButton; -(uint8_t) readMemory:(uint16_t) addr; -(void) writeMemory:(uint16_t) addr value:(uint8_t)value; diff --git a/Cocoa/Document.m b/Cocoa/Document.m index e7812d45..a5d291e9 100644 --- a/Cocoa/Document.m +++ b/Cocoa/Document.m @@ -513,6 +513,7 @@ static unsigned *multiplication_table_for_frequency(unsigned frequency) - (void) start { + self.gbsPlayPauseButton.state = true; self.view.mouseHidingEnabled = (self.mainWindow.styleMask & NSWindowStyleMaskFullScreen) != 0; if (master) { [master start]; @@ -524,6 +525,7 @@ static unsigned *multiplication_table_for_frequency(unsigned frequency) - (void) stop { + self.gbsPlayPauseButton.state = false; if (master) { if (!master->running) return; GB_debugger_set_disabled(&gb, true); @@ -834,14 +836,86 @@ static unsigned *multiplication_table_for_frequency(unsigned frequency) return YES; } +- (IBAction)changeGBSTrack:(id)sender +{ + [self performAtomicBlock:^{ + GB_gbs_switch_track(&gb, self.gbsTracks.indexOfSelectedItem); + }]; +} +- (IBAction)gbsNextPrevPushed:(id)sender +{ + if (self.gbsNextPrevButton.selectedSegment == 0) { + // Previous + if (self.gbsTracks.indexOfSelectedItem == 0) { + [self.gbsTracks selectItemAtIndex:self.gbsTracks.numberOfItems - 1]; + } + else { + [self.gbsTracks selectItemAtIndex:self.gbsTracks.indexOfSelectedItem - 1]; + } + } + else { + // Next + if (self.gbsTracks.indexOfSelectedItem == self.gbsTracks.numberOfItems - 1) { + [self.gbsTracks selectItemAtIndex: 0]; + } + else { + [self.gbsTracks selectItemAtIndex:self.gbsTracks.indexOfSelectedItem + 1]; + } + } + [self changeGBSTrack:sender]; +} + +- (void)prepareGBSInterface: (GB_gbs_info_t *)info +{ + GB_set_rendering_disabled(&gb, true); + _view = nil; + for (NSView *view in _mainWindow.contentView.subviews) { + [view removeFromSuperview]; + } + [[NSBundle mainBundle] loadNibNamed:@"GBS" owner:self topLevelObjects:nil]; + [_mainWindow setContentSize:self.gbsPlayerView.bounds.size]; + _mainWindow.styleMask &= ~NSWindowStyleMaskResizable; + [_mainWindow.contentView addSubview:self.gbsPlayerView]; + + self.gbsTitle.stringValue = [NSString stringWithCString:info->title encoding:NSISOLatin1StringEncoding] ?: @"GBS Player"; + self.gbsAuthor.stringValue = [NSString stringWithCString:info->author encoding:NSISOLatin1StringEncoding] ?: @"Unknown Composer"; + NSString *copyright = [NSString stringWithCString:info->copyright encoding:NSISOLatin1StringEncoding]; + if (copyright) { + copyright = [@"©" stringByAppendingString:copyright]; + } + self.gbsCopyright.stringValue = copyright ?: @"Missing copyright information"; + for (unsigned i = 0; i < info->track_count; i++) { + [self.gbsTracks addItemWithTitle:[NSString stringWithFormat:@"Track %u", i + 1]]; + } + [self.gbsTracks selectItemAtIndex:info->first_track]; + self.gbsPlayPauseButton.image.template = true; + self.gbsPlayPauseButton.alternateImage.template = true; + self.gbsRewindButton.image.template = true; + for (unsigned i = 0; i < 2; i++) { + [self.gbsNextPrevButton imageForSegment:i].template = true; + } + + if (!self.audioClient.isPlaying) { + [self.audioClient start]; + } + + if (@available(macOS 10.10, *)) { + _mainWindow.titlebarAppearsTransparent = true; + } +} + - (void) loadROM { NSString *rom_warnings = [self captureOutputForBlock:^{ GB_debugger_clear_symbols(&gb); - if ([[self.fileType pathExtension] isEqualToString:@"isx"]) { + if ([[[self.fileType pathExtension] lowercaseString] isEqualToString:@"isx"]) { GB_load_isx(&gb, self.fileURL.path.UTF8String); GB_load_battery(&gb, [[self.fileURL URLByDeletingPathExtension] URLByAppendingPathExtension:@"ram"].path.UTF8String); - + } + else if ([[[self.fileType pathExtension] lowercaseString] isEqualToString:@"gbs"]) { + GB_gbs_info_t info; + GB_load_gbs(&gb, self.fileURL.path.UTF8String, &info); + [self prepareGBSInterface:&info]; } else { GB_load_rom(&gb, [self.fileURL.path UTF8String]); @@ -861,8 +935,10 @@ static unsigned *multiplication_table_for_frequency(unsigned frequency) - (void)close { [self disconnectLinkCable]; - [[NSUserDefaults standardUserDefaults] setInteger:self.mainWindow.frame.size.width forKey:@"LastWindowWidth"]; - [[NSUserDefaults standardUserDefaults] setInteger:self.mainWindow.frame.size.height forKey:@"LastWindowHeight"]; + if (!self.gbsPlayerView) { + [[NSUserDefaults standardUserDefaults] setInteger:self.mainWindow.frame.size.width forKey:@"LastWindowWidth"]; + [[NSUserDefaults standardUserDefaults] setInteger:self.mainWindow.frame.size.height forKey:@"LastWindowHeight"]; + } [self stop]; [self.consoleWindow close]; [self.memoryWindow close]; diff --git a/Cocoa/GBS.xib b/Cocoa/GBS.xib new file mode 100644 index 00000000..6d5ba017 --- /dev/null +++ b/Cocoa/GBS.xib @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Cocoa/Info.plist b/Cocoa/Info.plist index 4d42b46e..5e409c98 100644 --- a/Cocoa/Info.plist +++ b/Cocoa/Info.plist @@ -51,7 +51,7 @@ CFBundleTypeExtensions - gbc + isx CFBundleTypeIconFile ColorCartridge @@ -68,6 +68,26 @@ NSDocumentClass Document + + CFBundleTypeExtensions + + gbs + + CFBundleTypeIconFile + ColorCartridge + CFBundleTypeName + Game Boy Sound File + CFBundleTypeRole + Viewer + LSItemContentTypes + + com.github.liji32.sameboy.gbs + + LSTypeIsPackage + 0 + NSDocumentClass + Document + CFBundleExecutable SameBoy @@ -156,6 +176,25 @@ + + UTTypeConformsTo + + public.data + + UTTypeDescription + Game Boy Sound File + UTTypeIconFile + ColorCartridge + UTTypeIdentifier + com.github.liji32.sameboy.gbs + UTTypeTagSpecification + + public.filename-extension + + gbs + + + NSCameraUsageDescription SameBoy needs to access your camera to emulate the Game Boy Camera diff --git a/Cocoa/Next.png b/Cocoa/Next.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9a4c318c6b74cd95443dafd7d2a0c0eb1efd60 GIT binary patch literal 1676 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 literal 0 HcmV?d00001 diff --git a/Cocoa/Pause.png b/Cocoa/Pause.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb380b7b72d8838d8e4410daa05397ad16f9439 GIT binary patch literal 1614 zcmcIkO^@3|7XvM(pu{zWApUmOhi#R(6Deg8|e zGY^3vmztq@J}v5S9@z`t5Z30H*k}RKCy~8t9HQgo5cO3hk>BcI?sz`x1}&%4_JZIG z~unphOUcNmkr)3k%mX{gOxAXMfODNG9+X+o3&=`ma4|Y34(x7m$)tl z1g_5u&E~kMx7Q4@ta+7{I#UHQjBKP%b!3CmWe9oM&=&P7O^`4$XC-l3)P%GKCduW{ zJa5po-a7*?E4}X|u7~HPBuBDVrxllbXR^@SYiEKtw&iIxT|_E4kyDuitOj9DWnj9MYW$y~bful)ND1FE8!HuQY@v!fE5(mQX z;I!LKnQ*1k73rGoQI)~(!=`Vu8dU-q`N-wcO)2iO)WM#i2!f7}-GDoO&}D&0JsSxg zrmD&rG)tDVu_R?Nw$U3keKl28q6Fl;ZCV=GA&UL1hWeeaev-%Xr`2kjp+)C~jGKm! zY;GzoA^PQU_KxgrrgLdOn@AwNr1(o%tx`Q>mE0XerZ?*_^1cXac6Pb`&8q)@>t7|9 zPgpUQFh_}PA|htuEXzawTe-!zx2Dq?4kOPjn^_B+W?IVvs4JMo|Ni;v8O-rJgLrp% x{RjT?59{hjPi`K(y0(4u%5(G&x)s+u*2ACgB|8s({nkwU!QMgq%U3@>eGN7g@ofMA literal 0 HcmV?d00001 diff --git a/Cocoa/Pause@2x.png b/Cocoa/Pause@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..36b6da0188ab9c00f2c0b86f132af5b22ada1b5a GIT binary patch literal 4436 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 literal 0 HcmV?d00001 diff --git a/Cocoa/Play.png b/Cocoa/Play.png new file mode 100644 index 0000000000000000000000000000000000000000..3f8709217dcecc464c72a8133fb273e784d1feba GIT binary patch literal 4442 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 DDNu2x literal 0 HcmV?d00001 diff --git a/Cocoa/Play@2x.png b/Cocoa/Play@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0de055300ff748dace38a9ccfb5522df06367a11 GIT binary patch literal 4527 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 literal 0 HcmV?d00001 diff --git a/Cocoa/Previous.png b/Cocoa/Previous.png new file mode 100644 index 0000000000000000000000000000000000000000..cc91221dd816c5226aa36517ec7f09cc88c490e7 GIT binary patch literal 1664 zcmcIl&5zqe6!%Ji*p&)bbS&*AzuL*J?Hn;Jyy$+LKSf_1o`${uFMjN%MN9DCaK}=Su5f>vu(Y{Kv3;m>&jj zcuYnW%4Jtn#!&)jMY(i&oKSWoa?}<5F!t5^x9_MZ*6(5(G-#&`RaDz5FG~ls4i21>`GN*x@Du9 zThXhg<+`sRgXj(>4%SUguX+~o3M^rwI~<$27ru zg%lwzfI)CJG>S@emhYT^m$}}D5@+p6BJhF8yifWG=ITd_)}Ob{S3L)l)%pnYN`IE(*23U_teIQ5Y9p3@8iZg8HRG*4#=o zXfAx!Acn3HOCx5R5YIL}!+DvQ9w9Sm0L{Q@PL~5q9`+{7K!d<*#aT{cCRz<&1yPkS zcjQ5O>Q&0=4zJFt!kF73ylh4 zXtvvRiDQ|-RZ|gXUQebGg=PsO+7~#9`zrcZOCM${3E$0 z-kGn4A)0ocM_JMEzRHS93(z}z9X=#`%julij|Kur&nW&3mdRc|qN&*KL#CJOF#M

T_cTYtRp@vRS5)_>W0>#6Ivob~%Fci(H? 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 Nvazr=FWv3M{};>KtZx7S literal 0 HcmV?d00001 diff --git a/Cocoa/Rewind.png b/Cocoa/Rewind.png new file mode 100644 index 0000000000000000000000000000000000000000..999f358fa38d23d07f289eda3ff3197fe925c51e GIT binary patch literal 1664 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 W565(3Hhfstopped && gb->io_registers[GB_IO_LCDC] & 0x80; - if (!gb->disable_rendering && ((!(gb->io_registers[GB_IO_LCDC] & 0x80) || is_ppu_stopped) || gb->cgb_repeated_a_frame)) { + if (!gb->disable_rendering && ((!(gb->io_registers[GB_IO_LCDC] & 0x80) || is_ppu_stopped) || gb->cgb_repeated_a_frame)) { /* LCD is off, set screen to white or black (if LCD is on in stop mode) */ if (!GB_is_sgb(gb)) { uint32_t color = 0; @@ -153,7 +153,7 @@ static void display_vblank(GB_gameboy_t *gb) } } - if (gb->border_mode == GB_BORDER_ALWAYS && !GB_is_sgb(gb)) { + if (!gb->disable_rendering && gb->border_mode == GB_BORDER_ALWAYS && !GB_is_sgb(gb)) { GB_borrow_sgb_border(gb); uint32_t border_colors[16 * 4];