From 06ea093f9a3c93c47ce87ecb76c24dd14f5777e1 Mon Sep 17 00:00:00 2001 From: "mr_wicked@hotmail.com" Date: Thu, 24 Nov 2011 13:49:39 +0000 Subject: [PATCH] initial import 0.3x branch into trunk --- COPYING | 340 ++++++ Makefile | 148 +++ bin/ICON0.PNG | Bin 0 -> 31641 bytes bin/sfo.xml | 34 + configure | 9 + docs/DSDIFF_1.5_file_format_specification.pdf | Bin 0 -> 131249 bytes docs/DSDIFF_1.5_recommended_usage.pdf | Bin 0 -> 92535 bytes docs/DSF_file_format_specification_E.pdf | Bin 0 -> 47443 bytes docs/Sony_DSD_disk_format_specification.pdf | Bin 0 -> 97043 bytes readme | 130 ++ src/exit_handler.c | 70 ++ src/exit_handler.h | 28 + src/install.c | 296 +++++ src/install.h | 27 + src/main.c | 620 ++++++++++ src/output_device.c | 97 ++ src/output_device.h | 42 + src/ripping.c | 345 ++++++ src/ripping.h | 49 + src/rsxutil.c | 173 +++ src/rsxutil.h | 49 + todo | 19 + tools/Makefile | 7 + tools/analysis_dump/Makefile | 147 +++ tools/analysis_dump/bin/ICON0.PNG | Bin 0 -> 29431 bytes tools/analysis_dump/bin/sfo.xml | 34 + tools/analysis_dump/src/exit_handler.c | 70 ++ tools/analysis_dump/src/exit_handler.h | 28 + tools/analysis_dump/src/main.c | 466 ++++++++ tools/analysis_dump/src/output_device.c | 97 ++ tools/analysis_dump/src/output_device.h | 42 + tools/analysis_dump/src/rsxutil.c | 173 +++ tools/analysis_dump/src/rsxutil.h | 49 + tools/sacd_daemon/Makefile | 148 +++ tools/sacd_daemon/bin/ICON0.PNG | Bin 0 -> 31641 bytes tools/sacd_daemon/bin/sfo.xml | 34 + tools/sacd_daemon/src/exit_handler.c | 70 ++ tools/sacd_daemon/src/exit_handler.h | 28 + tools/sacd_daemon/src/main.c | 408 +++++++ tools/sacd_daemon/src/output_device.c | 97 ++ tools/sacd_daemon/src/output_device.h | 42 + tools/sacd_daemon/src/rsxutil.c | 173 +++ tools/sacd_daemon/src/rsxutil.h | 49 + tools/sacd_daemon/src/server.c | 263 ++++ tools/sacd_daemon/src/server.h | 28 + tools/sacd_extract/CMakeLists.txt | 83 ++ tools/sacd_extract/getopt.c | 1057 +++++++++++++++++ tools/sacd_extract/getopt.h | 133 +++ tools/sacd_extract/getopt1.c | 190 +++ tools/sacd_extract/main.c | 368 ++++++ tools/sacd_extract/osx/malloc.h | 0 tools/sacd_extract/sacd_extract.sln | 29 + tools/sacd_extract/sacd_extract.vcproj | 443 +++++++ tools/sacd_extract/win32/inttypes.h | 305 +++++ tools/sacd_extract/win32/stdbool.h | 25 + tools/sacd_extract/win32/stdint.h | 247 ++++ tools/sacd_extract/win32/sys/atomic.h | 58 + tools/sacd_extract/win32/unistd.h | 85 ++ 58 files changed, 7952 insertions(+) create mode 100644 COPYING create mode 100644 Makefile create mode 100644 bin/ICON0.PNG create mode 100644 bin/sfo.xml create mode 100644 configure create mode 100644 docs/DSDIFF_1.5_file_format_specification.pdf create mode 100644 docs/DSDIFF_1.5_recommended_usage.pdf create mode 100644 docs/DSF_file_format_specification_E.pdf create mode 100644 docs/Sony_DSD_disk_format_specification.pdf create mode 100644 readme create mode 100644 src/exit_handler.c create mode 100644 src/exit_handler.h create mode 100644 src/install.c create mode 100644 src/install.h create mode 100644 src/main.c create mode 100644 src/output_device.c create mode 100644 src/output_device.h create mode 100644 src/ripping.c create mode 100644 src/ripping.h create mode 100644 src/rsxutil.c create mode 100644 src/rsxutil.h create mode 100644 todo create mode 100644 tools/Makefile create mode 100644 tools/analysis_dump/Makefile create mode 100644 tools/analysis_dump/bin/ICON0.PNG create mode 100644 tools/analysis_dump/bin/sfo.xml create mode 100644 tools/analysis_dump/src/exit_handler.c create mode 100644 tools/analysis_dump/src/exit_handler.h create mode 100644 tools/analysis_dump/src/main.c create mode 100644 tools/analysis_dump/src/output_device.c create mode 100644 tools/analysis_dump/src/output_device.h create mode 100644 tools/analysis_dump/src/rsxutil.c create mode 100644 tools/analysis_dump/src/rsxutil.h create mode 100644 tools/sacd_daemon/Makefile create mode 100644 tools/sacd_daemon/bin/ICON0.PNG create mode 100644 tools/sacd_daemon/bin/sfo.xml create mode 100644 tools/sacd_daemon/src/exit_handler.c create mode 100644 tools/sacd_daemon/src/exit_handler.h create mode 100644 tools/sacd_daemon/src/main.c create mode 100644 tools/sacd_daemon/src/output_device.c create mode 100644 tools/sacd_daemon/src/output_device.h create mode 100644 tools/sacd_daemon/src/rsxutil.c create mode 100644 tools/sacd_daemon/src/rsxutil.h create mode 100644 tools/sacd_daemon/src/server.c create mode 100644 tools/sacd_daemon/src/server.h create mode 100644 tools/sacd_extract/CMakeLists.txt create mode 100644 tools/sacd_extract/getopt.c create mode 100644 tools/sacd_extract/getopt.h create mode 100644 tools/sacd_extract/getopt1.c create mode 100644 tools/sacd_extract/main.c create mode 100644 tools/sacd_extract/osx/malloc.h create mode 100644 tools/sacd_extract/sacd_extract.sln create mode 100644 tools/sacd_extract/sacd_extract.vcproj create mode 100644 tools/sacd_extract/win32/inttypes.h create mode 100644 tools/sacd_extract/win32/stdbool.h create mode 100644 tools/sacd_extract/win32/stdint.h create mode 100644 tools/sacd_extract/win32/sys/atomic.h create mode 100644 tools/sacd_extract/win32/unistd.h diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..d60c31a9 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..0e0e9f05 --- /dev/null +++ b/Makefile @@ -0,0 +1,148 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(PSL1GHT)),) +$(error "Please set PSL1GHT in your environment. export PSL1GHT=") +endif + +include $(PSL1GHT)/ppu_rules + +TITLE := SACD-Ripper +APPID := SACDRIP01 +CONTENTID := UP0001-$(APPID)_00-0000000000000000 +SFOXML := ../bin/sfo.xml +ICON0 := ../bin/ICON0.PNG + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +TARGETS := libs tools +BUILD := build +SOURCES := src +DATA := +INCLUDES := src libs/libunself libs/libpatchutils libs/libsacd libs/libcommon + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -O2 -Wall -mcpu=cell $(MACHDEP) $(INCLUDE) -DAPPID=$(APPID) +CXXFLAGS = $(CFLAGS) + +LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lrsx -lgcm_sys -lio -lsysmodule -lsysutil -lrt -llv2 -lm -lunself -lpatchutils -lsacd -lsysfs -lcommon -lid3 -lz -liconv -lnet + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) ../libs/libunself ../libs/libpatchutils ../libs/libsacd ../libs/libcommon ../libs/libid3 + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +export BUILDDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES), -I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + $(LIBPSL1GHT_INC) \ + -I$(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L../libs/libiconv/lib/.libs/ \ + $(LIBPSL1GHT_LIB) + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @for TARGET in $(TARGETS); do $(MAKE) --no-print-directory -C $$TARGET; done + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @for TARGET in $(TARGETS); do $(MAKE) --no-print-directory -C $$TARGET clean; done + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).self + +#--------------------------------------------------------------------------------- +run: + ps3load $(OUTPUT).self + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).pkg: $(OUTPUT).self +$(OUTPUT).self: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .bin extension +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/bin/ICON0.PNG b/bin/ICON0.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f01f4df0975f9d6f31ca08b931124892c2052ac5 GIT binary patch literal 31641 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%0AQO37T{zWnu$x$4ZIQgq1gCImE7`Xw9?T~Lv8 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 + + 00.30 + + 0 + + + 1 + + + HG + + + This application was created with the official non-official SDK called PSL1GHT, for more information visit http://www.psl1ght.com/ . This is in no way associated with Sony Computer Entertainment Inc., please do not contact them for help, they will not be able to provide it. + + + 0 + + + 03.5500 + + + 63 + + + 279 + + + SACD-Ripper + + + SACDRIP01 + + diff --git a/configure b/configure new file mode 100644 index 00000000..678b57bf --- /dev/null +++ b/configure @@ -0,0 +1,9 @@ +#!/bin/sh + +## Configure the build. +cd libs/libiconv +CFLAGS="-I$PSL1GHT/ppu/include -I$PS3DEV/portlibs/ppu/include" \ +LDFLAGS="-L$PSL1GHT/ppu/lib -L$PS3DEV/portlibs/ppu/lib -lrt -llv2" \ +PKG_CONFIG_PATH="$PS3DEV/portlibs/ppu/lib/pkgconfig" \ +sh configure --host="ppu" --enable-static --disable-shared || { exit 1; } +cd ../.. \ No newline at end of file diff --git a/docs/DSDIFF_1.5_file_format_specification.pdf b/docs/DSDIFF_1.5_file_format_specification.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1e6e835a556bd007df7441cfb0dcfe037cd7013f GIT binary patch literal 131249 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

tiNmqicqd>XDxS*lD*lq*yC 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%0ARsNcKhJ6DKo#z=J#9~l-^ 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�<%MUEHM6&H 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 literal 0 HcmV?d00001 diff --git a/docs/DSF_file_format_specification_E.pdf b/docs/DSF_file_format_specification_E.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6be14da540c337644c21d5dfbd34c6a4bdd7a9c1 GIT binary patch literal 47443 zcmd?R1yohr`aTQ-(p@Sbn=WC~El77a(hbtx-AIFU3J8dVgwi10ozmS%w|sk}p5wX4 zbMC$Wd+!*(F+Oqcz2;hT&h^gceco6xCz-6EFf9WeGXmMt^1uiJBY+-YrDuk~%?%Vb zHMcjk1ptN3b?prW4fU-I3=x2mhL*gPB ze+dX!hJOPPCII{Y5D910iZfowib807=DgU zz&`|xe@mTz3@?lTMzBP85P)5(f`gv@UDN`f7Xirs%i!@>f${GH!JSQhr^x?VJeUED zzqyY87>|GA_I`?t|7Y=F1u%X~SU_O>$9Vh`^9J$o|2jPw0F2)i@HNumBi;%TE7eJpMjGxO3b83v*#+rAPQ4MwG)53!sSvErZ4TIAacxo%H^jd89xK2OAM|))J+Nmf2m%9kwxv z_`z);tT?y%q5v?SAgYD+*{!Tx13;9vX0j4ZA&3C;__LW|vH2{q2#P_&)UBDSdq!lXeb17ka8SI4Y&55~#{vc|NlCGq>dFV#&W>K16-BkHa0 zXwQZ|rr@BXq6g=;!lLlM+%R}cc=#pZ)zMaXoSRE+`;#CQBIiM$7&AbSlUi`3tDoKS z-k@rZ_!7M-O~}oFEqNH5OU?5TY)YB|y+;=#N!GMs$-ER;hv%uR2Pui8JkQ?QS17F6 zq`%~jG-zmU-+ukdd^FZf#A>{oFPzP^6qmK}gxFk!hp6|&Euk;6GJD((X zjt$5C(wdkLYf2ir&rm%-EPeiS=5`lT|0iT+qG$PQw*E*5|AwvKF1G%CTiw-Ei=C-L zmtLh}Y4nXxKuSaM3xnABa4x$Pr`K_qC%;-rxKddm|76!}f`;(oqwRjB zX0f52HS^`Cp!?6}nR8wj5uMJTTOZgSt&7xI(KXJ0JnMVi7#Q@qr>{@gY3A#)*1~#N zLLaPg-rAt-@X31)x0dg#c64Yh0#o{CY>OAH0kQtboai}D%99!(}A8&F0-IAlQ5nj;dJRG>@5_+TgCQLR}_*P zM8V0otoJ3HYlOGN93CeCEw0_P7_J9VqMs+vc_1t4=ml$t8&T9|)eR|8bdLq| z(N@BA8|iaim}0w zP?dQ=r!7xpR2Oe#`tl_nZ2Ch`zPxvG+z^teL2oRuxe7&NvYzq5v~I$p$O8s>RxN)M zHmHzSlAE_oCq!I#S=HbH71E|)sWgSp?b?StP5vG2BZ_3lCuY{Zk&4u42ku0`acbD7pvCl_0m zW{0DUVf0i_>+t46@D$>(_K{i++Qxb&g@b>5vI~9Z@sWY?ZQ*r~HQ523KgILg zwA>r&CsKG19&)+vXw@v(M3Y`<=8}cqlh$10vZC~O9N^g7S-);ZgELhgo*abQg#4-+ z(P2xW8K7@YCzOrK}0r%?<;nDmjwc zxhHC+SWa@pO`XV!UdWNo_?xRRA2$Y?XZKo4E}c9bP(1@a?LS}9t1XPA8g}aCZdm0x zm5@x^DC135Xv}F<%VNRY(n2I_Zr+z-(U*Yb@Wf3D=`R?q9aEs2yL}6fJ0;h5{N^4M zCP8fSKKcW*B5A=u@!Q7k5Oze0#WJh6%U^taj5e395Zwyoan4HHJ8WbcSR?{h+@ey( zYL=0VDV$QNaMwxuRhLrB_Y%)nZTpMT?O1)CN@zBX%PUl<#J&pYQLb5-M#fZ^46eyV zi&b68EqheCo0N21Q4s0R9$kLrcR;mr@oScZ5X87YJIX3A7gl2Cvj17qyUavax`idSw< zLTQ)JUL*%tuv7pcsFTV{^vs-$Y#Tq?v4C{cN$fEN zlGGzWMNr~{MnTS(T{FALGkJ) z9PEY#*S!q(Q$_OAl~FTJIT>U>OxZW`u&^KZk$H3+ie^vPOg?Xu4);;Vxl|@a^5jjZ zAxxw$BSFf7hc<4XLtiz{wO55lKd+lZqt&97T7}4FcVQxAWjxfW5XMV;U zOLta>|7DK2qdW_65jpEqgG*V~%NX>B-HnsnOf2^1eyyyZ@IHwa87O;`J?#F>`t?T3 zu9883%*cX2<)CHPusPAvm6$+^%)!el!#q8iftJOWVY7K(B0^y*qm@-QF;mAGHvDi%Ec#a&3Xyx!hxZy$yzVJf+ z;t}el4)({n+XScw2KAO7jZ5^q(?|FUPauKfDzT6f6VYO+pC~N^^)}6>^*1>gLlo$V zL{`K%@A0;81T4@9AtFs}rOv(9;84+AWL&2wGc);cR_a-^khFLKTK*4vjzFtM&$ z-bb8pC+h}W&{L1D`nmY%qAL_}VvrDsMAA2CoWDwnj4cj0gaYCZ67l6vl2PFVunnF> z5-IT_d7u=y(z^O*i8ID&!xwN_OlWmcxUDosQ^E z9Yq}IdxcO}HV@!;I%0L`LD-iQwhl1Rqj28{(iiIqjw?+(iM^L6o?J>AJO}gDx0hL$ z2z%I{BzA+Kou(^38Nw4K(7h{G=HA6t84iY!fNM;ri!KR;8&(}&TyGW$X}m~;;{*HN z=UvgulF1G*w#VYaOuRkb0}rU5C?@VQEdcaMpS<8d(Z^?|W^U)}uUWSqG#43b?sIVU zYl5MXm#B|pPf(1>au4)l2A34UrDTE_^}|&BFuxp58?!Dt-Z==Adu=X^1zpRTzJltA z?0$=+n3SDR8NM2CfUN_I?3DSN%|ZHA&>Wn+~FORm9qD+?C_)N0!ARsI7hT^=%hHDZY$vL4NNh z)W*FYc(iu9BnU$r8DUkWD8?8!HIyY-*>URS18(>}>CpG2utyvl=EAf#DpRIH9Bp6P zLc9@Q2{m1q3ISZv_;x8fml0M>4aLOOE&ikjQDEc zen#VkEGTA@(b*8q=_b#jZmrtA;(ayG$M_|eFX-JwlcZXX_#r|0qn*S8h|Y+8C{kkt zqVxB#QOtH!mLVfZT)SjJa+pYL(OpED(mauz7tC8oi7^BE-48c+p6f}|X{Fe;2m@lS znBd?9htqXORin7m)t&)jVlf1Vc?7~?y1MuP!#0euRG$$AIhCamh#!8UKJ$P>99`|o z!H;}|h_Tu2SCK<0Ltg0&Y76#!N!^jOew~@Am_DLKi6ibF$o=Z=zKFPN3eL_*Cv^y_MBh7CB~r1pe&W$r zc8c9_(1x6xrdIM8wxxE^I1lD4A6dlnjfvh^&ZFUB*QBEk9e`3HlEjXb^e|!1t0BC1%{jInps!L1 zGc}}*OILCx?V+LS5IR{KKCqbb>EP(oeet%d5b=D65Ka0$%qjU2Ipq)Jk)I!x23$S6 zNa&)0-RvjYPSLD$hU!>vy}{3TEhKM;KGv@koUe?(q!09OJV|$N1Q2Kv5x`^0+7!YeND>#J+GIz;S=muYsGY91n}EAPf;ZlS-z0 z=f03wu>$7O`huUo92W)ur7F{HDHW`nf56y~pu@a1%qz8NHG6(d^;rcx&!8ivN;C~<08WjIlaa7aXECB%z#Z!c_Wnv;x*;G*n1y7+S?j4X=o#;5TZ^*P3}T%U#^noOu>#_I18UXq1)uDwWD9O?uDZF z=vD(J!VW*E3+P#>J2Qu00_l7ov%s>k7DMiBB?e4K)+eM6BHxYyG{uxu!)cOPzyeiH zt-YL4mH$35wP|)3hu36dYXwD|?+JGw{5b6XIgIZi#z$0XJ4Xv*3HC8dY* zTw6Bo91SP5SyDn+LR4xeFsnXvKJtdZXX*ijgW7}F3om!|-8yS(Wa%(#d4b=4Q^LUifI*n*!#8M2g;Kk1prN#+ij#VE(+FTZ~Na1?+RCFrq7#;h3`Ex5{raZaY zY3czd44Z~bGbc6XpjnLQB^?e$4hFfNT&oIv7=Q%pWGlnGB%InzjyBmK6ay(vj1kAn z^g!J#6^5=N{{97#ORlf80loq6wF*78{wdSy>`Inx0tzuMZD3pp6Qq6HJU>6g~0nA zPWmxr^$~)oW30j<5k`(;nfYZoc|(aSRymokrDs0d5D{aIl)ck9l#=mwd-yAB#E%Na z^yy#KQRfMQhYwA4Wfwc$QC3?0pJq|NSMWwZ&TWo-_OAM5d^n-kZW$`EQMYYHEj5yr zeZ6b|Q5gkqkAs2)Q2)6V6-JY}P_{T;j^tAMHoPTB#ng!6vS^CVSo(SAa&hn;PYIa^ zynYS*$b1XbP?ZeK3Z?$*03kDL=pF%BD<8=6BeGM4o_sSbyh^mEj1g}nT&NQht@Z@IHLW^dD5JD2m@sP(G)sK*yZZXc% z@>m7(Tz0TonZxpmSEeKr$#H6Jfcr4JVaz+-dYKEMVz(aY7_R2^%@Zm9L^71V3=87` zKt_-&B4Lb9DD2R&%`5upjSt{q;>}rr#bR{+lkWUg6s#l5Ld@)&g(U=*tF6O<1I-_621U zWi3%ve1V+OBU-2X5>sWb^*9FZzl2pMop;O8%7Gy@-RAOh0Me<5S!%UCc=gsw#CkFq zH@bPu7^%W}wr7BV0w)BAKW;X*=>WDHzbOyHpc@7uYsb~5q__h9SqO0qs&>U!}!co>>JO3p^9?~NEA5}`KT(y_?6kCaE69XQ{Ev5V`bB&hez{;KN_R* zR}?s=Nc#|rw^0}pdYl8uo}+e`jcVLCe0Yu{LHt{#sXNv6J?tSGUmKOksW>w}VjYrW z?hk1akZ{=Z?TX|T`&S#o)xmTO3If%{qbCfhMgtSd*WIc_@WyMq2o=LWyL(NU$w1PJ zD*&g>S=S!YM_}PPdxK7VdVg#7A-F|<=qDQ zbqtiuU1;RDj1U&jT(qovC8BCQt#@@{vA4a9J)_Vu?Z zD5g#djh}J`Ju=z{Jx%dqn|;YJCsFLLbn`ZaSM#AM=PaS+S9gb_)7Q&y9NDv%{T8Y| zSRZ3Wsyvp~Z92;w;Oi)l6^g^RpQshkeYqj2cX(B+E&VASOZYJ=VQR4e#kl$67Z}dd z7WwJIouIaWL}Yq`+4&2fx+9Kt*lqc7)JZZG3{9g4(UX|WA3+6h-9s(P}fG7wl@r& zmQlTcd|8!Dipi~q4m|}V2FG+7JiP*q=^d7uc8}_xx*ef%6U}#FW9_a`Kv$ z3{P~cuTAY}<}$2}A`QoT)ncici^8hWK7eR@!b-2D*7Q4H0vAsKPg(+ z+FQ7Y@v-`Jxgs*LznyAe5arP_=%nM5rgY+z_OhCHx#Z>abn&MOa6ds$^#Ib1J4tx? zxI_`qr%Ha(n+{`H+;6tlzTiUD&ybck*RRkK_AkbbC5O*j+#5n}=+{+hfNs7*sOSZv z(S%8t?hjWdYB)3~E6WhSj|?k}C6;Wcoa9ac;HE^=65F|=*Sg$CM>9oCo6kkeh@41* zS#Z>c>ry~L|hSUbY6lDvgP8V34==mJ*-k&TTWA8Yky^GQFXyj%5|H9u%M6Rcj$Omuu- zA)Nlz!@=#OHRA1zT;Z(F?QUA{6*_0Z^l}@TOqFx8R7#^uSOR?1*0~h-MGqDII@!MC zTN3`hy(gr;y&(`$rO#2R_3F%zY&eOQ$6j0PwG~t=DOkLKaB_)w3%6#u1=4!W=8$(xKRG>P8Zr< zUI5;%?NYa&FRl8!xhKoK>VEIhgGgX;LxsF%eX7nrD4TpX#2&mqroEC6|Nj1?{W{O- z_-q;DY&3yLqioEfQKl~bEkSO~-NA>+A<}{h15etzlY)=Sj1nny#|)0C`(w)pJ7Be_ z0yeooH}B=$q30rOU_Y3%?6oqO1_ln+?{K?UuDyc7D|;?Ye6DK+%+*_Z1*Jln%!RJ! zWHo_HtsH2Z6Pb480i^N3z)Ge|xQ6tJ9%c`E>GSywqETeomAR1>Tkf^}K*dvfzxUg# z_H0i}pXH{GVDb1nKf zt}kKFO`3ypF>pkyhk}k;GyM%eZf3koLS6J453K*ki?Z6<+3_xa8Yc$o+?Z;;T}Pn~&3P`jgUUh3Z8Hx6e1FkcOq7uu{9xNUdJC>{UG z?V;iB+?id`qsPubC~Fr6-{mt#K|$5N9R`TiHn_0)9<(wPvYdgsgo017RHH9v^>n-$ z_=FcGp5(rBc>-mcW#~#;i~TV;u^y>{<=h{)8D5ex%{T^`he6@P0;U!;1^vUaeu^lb zroy)~_clkPH1#^zt!(=RY40tznz%F?V4_1UIzNH{7Y0Z|RNlFJWC?l&MA_3iH-(rp z6L(XJEasRT{e-dJbO4?oHV%vZE2fR5wghY{dBQN{8*v3r9XE3kSo`GZmka0TGJ;a_ zDG+hEBu{w0V%`n)!d~b88+3xErp$X$;jokgwy6HzDCXRr+T1rXgi|GqQO9DM7&i{d z3Q)aLjBfS$V$#SOO<~^EUBM1?-pAFHmmO5ol$ZLvA4xB_nZvMX_f<@Y&0>W3pRqHj z&jq;=E8l~>OeMT&(J;rjf%M&a67xYwDiNrO)>5~$oU5DeSoU!3q%=JuDJ?%Uo={^m zkFu9W+VRF#vg$$*X*ZT0h@+eS#wIOzsfd1`#fQFRz}2@aCCH^6FYp2`0TU7*cOoRX z>`+%R=UX)gN+ORndhGyI`Fyp+jwW}60fK#|=f@vswHAESiF(Huvi(3_s^wexq2{;NX4v?d=VIY0Az}FQi%2rEAusAziyJ0*97SzzBrLTKZPc-cxrm=EHBnwqKM|*7 z4Xy1P%vX%l8Cw2Gp{X4Q2(mAcsZqrtgKkp}#mJtk&h~G@oggIs_&&fn%zcV~$kXk4 z+>`Y$bdT1^K6RPIG|4WyB+KZa*;qzmJ{XqVT7nK7t>=G;NZr4SZv1%Xm=J$-1%iS; zl{^4r$Cg61{1rTs#MYYx@y~HOP#Rhw+C$$*M^~of187o7Na~2LwsGk5wGjo^%JN?p z#p_sUSYk8!R!Zm`i$l;`N#Qp=(h3)FUbN^I*`dr195&v7)EfC@OtV#re)Coyl7)8M zR3+X3Rz{Nes(an2BCZD}tmX@RKC-!!k=f zVh;rDsny4Mwf%PGN_!MZX}N5Gg9g+5cUJ{R641geKKcViv|Z`ht#9Mm-nkdUUk`^2 zp+5}=5T8njl;|6r>AhU$!4__+Y^>SSiZxSlV8N2sQUPn|bs} za;`4P;X5pfmFIySQ|T5U-;ohzHKuS#+u?74DR*KVZS^p;S0&WnG1`iwihLeFdOyh1 z74FV;PO*YuWom?f=ECr42~^ky1BwlAaRhwG+AejDdw-4SMIh1115~DhWP-7lgYfO$ ziQ96S+a|6$xILYikf)gZUm}tWq4&QKfAj!6%q(^{JanQRVqESUfjc)+ zvMSj6j9nb^u3(3M=TnNtP%RYF>7`O+A0stu6G@>AFw7Y|9>`2^9wJ%@Bu@@4e%oA6)X~f-?a0zwZ8ub znODsFg8eWSvGL$k--s)+Fk^6HrizESTnCS_kFAWkSx`{yNDBQ0@ZLvql5yQ|ko%m+ zTGzv?@_`Vky?RDukj$cMn(QAOVx%$Yk1w?$_)N&rOqA#$ zm=~3b5;2P7+(1)0O)@BL_IvE*ol75MZ-ZFxby7qhU< zgjy6yY%eG{%Y$s}Fj*rJ0YhM0F-noP07pWe44kVt)7_Pee+#qWn%KYvofGqulGBGaALi8n|vANm`paq z%prZw{iQQ{rL_mOofA0`~axS4ndSaU7EH>v3TSo-dz z#DQ>iGq%+wMw@c7P1)NA(q(9J2Hj=;8iNq&!w|&XM{%m;J0E zoGo<%k?_z=m2h-cKJlW%yz9PKSJ$b)`mB|+G>XRuc_$FwbR-mk^xWMV0h0UdW}z3? z)k-EQo6Miq6_=pNBbp{lbr?E&{0M*~#Ykm5{_Kzjq5#)L95YxImTDMw$bUAUIAEGg z1+7@(5nwn5t2FnyS_q|ySm=Y86@&>f)_~yb_lgL|@XR`mnrXIqhDJi6Ghey!&VAU{ zJpm;07MCoEeFp`vE?^@LQHhxvW&g<$tZEH*e%zE=?!}q*%;yESr#B6ydpX&wj~jWbl&e3%8arsmu#!{*qxg)l|RSnN#A9{&7!X#J573PF6o(w#n}Y1zKD5d zOu1MrPKZ^Z=(<|LHqN*xo)`0aQ!{L^*3&yFm^zQ$=iP%gl-QHCTV$)_I02hN-u9sV{>(rBK5{d9B71l>Fq@d6U=ZTYRvW9gSwr!StMvxpVgrR9veNG4y^ zGow3rh(DFi-bs+IQsbYe&+UJswD)0F+HUI03ARL8_vg)cLRs_1^0hj$qNh3OU*qel z$_sE_gaoeCI zBqMI`j^%k3CGXuv3G2OKkI)Rrk^4T#`1# zvvt8l#L}1VSBH+_xqAw7+UK?LWDDhhwVOj85>F>$(a5*n>*C?=5D|T)AhxeAG#E0G zQ(Bs>5abVK>qahiRsazBeLjO1`^aOBKWAl~s@DgWCmLu`c_lCaw{#EGA2`vfJ6_W3zgy)c?*BJ|P9#xFAmrs7EY zYjEO7%D8fd4+-DZth@=XTRi@{(P-10zEPqHiLs^ktO_;sVm?|GzO@W}lZpu9*qHcC z1JkpLiBuJv{;-(@_3k`j1+!HYPn1_tfK$7SKq{JDBc%r? zOHTZ0S6I3ywBjEoEf1!~ZXtBAgg*Y_7UTbF#u@_)>)+fl|L2nmnEqcU6|Aat+2XT2 zXgE_i4#yEf-0eZu!+6E0M4FTm>-VCLwE5H-<{E+S>e361XOkreXY46^OefFG$VMw`ZTGjla1@3wu-x11rpydh_5JRkFji3;;E0Nkrb9bH=NZauaQbs&+jH%sO@bzGd+V}QWfQc zPK3gHi{TCV77_Rojha2ax8SSefx_$RcJYd^8>53&zOyiV4 zJ=Eik>P1M|5W?sU)R~G96H4gz(CuO+kBVmnJPej*Krbiga3_+*E4a{yF|u+tMJnU^ z5%FMZd=wy#QZ^l-i+J?r(~^Kd_=kb;M(bKisn7Y%Pm(;nU45!c#hvEw8`3(|XaPbi z7u!s*HM*f4E=iMHHgn2&B%@{W9$ui0g)pBvu8;__u?3nHDUBWq359JJ32oPlQIZUk znG$~Z>eHSkE!JITvv?L_nhJqi+S9u6q<{;9Y5k~#v8QzwqDMMP0`Nku%stL|&Y#^3 zX5IT0TRxkrI)*QvnwBx@J)!JFL8w*8x4pOYn6rVG_EY+cPcpj$4WybG#Ux`fj}#w| zrB(za^2Di*<*SKe3Ny2QI^j;(f{m2(oro_@v=(~0>nb08a)oKEM_;rZ+j33E2*cO# z>=?vSdCSbG%TF~3bOPCD!HmCh6^X1SUuFOWLt$MI%q`+ z?5=(bKE!fkIety!y=n2zy!RO#!Zk^9ri4?QO@(RFiJei~+7ICL?vo}|2`8StakKxYGpb+Ole|B2AJ(QSYS)_CUGf}K|kyz{jeZ+7mCS{v<9|L^1~;R z<{@+(*)#9`1y;k|I=b31rT2o}scw7=TjgU- zu!H(Ez~St%Q-~4%@eCJ)sLgyWl`1FdP1S|m3L3x0iib92EdnW_jE|xBC;yfcwvljT ziX)C<=8LJ?*Syh@>TtO=JcNdaaxj@f${V1U2FmK=_Ul~&b&UVi(?ECJFu^oHCo$;&ujhDb zVwr&5^BA6lNgYQdBly*Nzv{lRl1KNLH~Pot6d5?Z`pE8nIZQn!kcxirtUY?(^b1(g zVojGpMXh8pq;ARZB0LmPl}Q} z@R}fPc!c2LG!|yzRey2O%3|KR>s}Tw(pae*6gN&y(alcj&0?yuHUR70ynlL-J%Mrf$3GSpu)65)YX3O)tFS6`VWs{ex!z6%BoV(c^aw$q5U{ zi3xt!ki3Z%D@f+6ExJ{U|`2$bDM)_~^m2O9^-d9d8YAkcf6idIUNrr`Cn zK&l4;1X`5l_p$OxsmO^-(I_giGcgOZF$)RV3y2BQf*caq@qyN|5(fRF75xW00Zl;v zeY|1@pmnlL?Oi~%e)p+&zTjUH@-FuMQOIv$?I$6{R76E2l|VwW2r@BqFf$1JmxTN& zg8l6H|BU2aApN6|-@@TfLdr>~s>$<%gk)o8WM*ZiXZtS+`BS+3E1IzUiY7lr(VqwR zdsG93px>Fn3N|$mGr-*WDa^6{Da^?TN=pfffQHF0z`(&S#LsR|52C|wO9?32Iv9da z_j9oOi7l+(o$`+W2e$G*7zG&VKk(+yG5i-H{4P29C(Rgt0n%M~{U`01IsR;echUb3 z?f!@xXgN7uYf(c}V-tG-D+f4xFxNG<1AtzvmNK=o1I7Hi@q?oQ0`ME#>;bfl^sJzE z-^>m`33N5IwF2@1U4WKAeV~=4AoO09peLf%Yc0hK4{vpb^jrv@RV`2xtp5 z1_}f1fF?jaTV4GZhW6%$M)p8^peaxR=Y;Fjk|H*5x{K+N$4Xo^-`1~)y$^feP53ox90az&@ zKhPCu<6vcP2-b}`7;1w%u%$t8-|aWhGrt2AjJ^7I^kqQ!+kiA+<6vlKZwdnQP8G7> zm7!}7G%|HG1j>Qb@}rAy`2VAl>`a}3@^`ATGjuex1Sw1uXlQP3YHep~2hyF{AGLQ! zDxe}ri;ln-Kuc2)F_eH#e^RO5x08N5qcwOf!*B9~x4!KJ<)R>k+r0o*Njr+~hd zg@rEA#KqbKB*zb_e?<&hHhK_YL5qs9v$F$O*+GHr2Q`>LHxhrM#`o)>AJn*0+HchO zRYLZc+yIm8Uo<(8RefUy$mIWMaBLthNa;F%H$QNR&+&&bf=fS)5!?ev%pX<&O6tJr z$Tx5G^YFgM({E<+z0o(?|3wn3iGBU8Tfo=V_#mO`y`4CzFXhLV{dX{MVS@!5NIVn%n5q4pE+3(}ZF&GVfR*_2P zhh1xVd5b!bM_BAv4xcP?e4Yc{&PiZ;@IufxntWT8=Gk+}D@AN$Y}Ju@Mdx}bKGrDR z-L+>Wrtk<<)NJV6&U8~r8Zpr$UITiF;cM$ShqBFvTAKZ&PET!^#+l}yRjcYC^l0`$ ze{2_}Q(6*Noh*92tk4`3<2$nhrCF&6{PTT?yUUb65fMb4ztF~A?(ipV{3(6-WsdXz zqK%*8{{J7e@u!3V%-K6_+$}u=F8yR1Ah&gA1%I>+wm)S#zf9)-N*lkYy(~Z7O88sw zS=j$*3Nj2REdZn$mjExc7!#poepCvELh-#^ROGXP>GE+e)l^-C;&GRJZOfzN7$>>BxI&c`YmUiK{S@(O{4`yDm8I|c{tQ|1F*9OuQ3_qYWB5xH6gv0KF?bf{KaMh@3_MCfr-n~n&vf2mmE}kTD#uR~0@?+U7=oj+yyl<9 zq7d}QI5^c%1RZeNQUVA$mSPdko9IR!eRv6t+2<25ym0T;@(Wzt6n}h6*7~^+9n>h? zt(2w>6Db_3=jmd{n#QjC;Q&Xkak<3nB*i?jw_%nSBL!nMs<8WxL`}5DOT(p)gkj($ zc@MD^ESl*KARA4kUjJf*zr2wAokt*Z{yo0~CziiXMA+Csx#}-N%H6#x4iJ#6j4Z#$ zPG(So2qr9uI)>ou_HSJM5j*eB13LOGzWh25|Emykmv{fcY5ll>`*tz-qx6f*S3y%F zBSTQu0ABnUv_2+K*Vfj`=`Mx%ISAb4fd2v~m{`EKzJ9-40N)rB_ybGQlwD*MT&fy2 zJL^Bdn3APIV#V4=0wSt*8!C2(EooVaDQSrV$w-NOp7DRe825h$eNzV1jrS)F4u@1T zK*t@#d7&Xr;K8ZP<=9yD23KVJWN9>2;wDjL|9(%h%6@&LmJ)URjN9IR`jN-{MgJmN z`5ZAjeuQxjqf*|LPOUnb!>wlflLdN6D+a`BIElPs>D>cWQUCPgM8CR^oiAQJT_C7L zz2-!fZiLFKhE8Z1nqYU#XW>vcj3E}ly1wwqCzD8^yPAlP$78d^60@C~LEnwrj1x1> z2Aqn#lFS{?=^kce4RI_TqK;>ji_7UAqO{M3E>I+Q;B}iM%96+T&mc%&(>0rj6Oet9}hebV25lhXaaC?UA3&8P+iG7tnmleGmw?9n2 zJ5I$I2g@X&2p@D@kiANyT&!MCE_{v7S0{r{bc)FpVy%ac&bLE;FGMB;ummUzQk4|M zAZlH2)zU+@2|kA^i=31$qR0-R_Z6rU=p}K7dwf9GOu<85g@zdX4ClEXj$G5h(u$2` zW1HLCn4FQV!rCmzPD9T@{EGr9F

X$c8;J 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%0Dk3Cw5D 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

MQYsUxZOlDxTh@g*kiUncGLgDbV1t$GJ3!2 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 literal 0 HcmV?d00001 diff --git a/readme b/readme new file mode 100644 index 00000000..4e5ded81 --- /dev/null +++ b/readme @@ -0,0 +1,130 @@ + + DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. + +--- Installation --- + +Make sure you have a PS3 model with SACD compatible player. For more information +on what model specifically go to: http://ps3sacd.com/faq.html#_Toc180147566 + +You need to install a custom firmware to be able to rip SACDs. At this time of +writing the PS3 firmware has not been cracked for firmware 3.56 and upwards. So +in order to install the correct firmware you'll have to make sure your firmware +is lower or equal to 3.55. A downgrade for a firmware higher than 3.55 is NOT +available. + +The custom firmware that is needed must be 3.55 and should allow patching. Most +custom firmwares like Kmeaw, Rebug, etc.. all facilitate this. Google for +"kmeaw cfw" and you'll find several download links. + +Custom Firmware installation steps: + + 1: Plug a USB stick into your computer + 2: Copy the custom firmware file that you downloaded to a USB memory + stick as /PS3/UPDATE/PS3UPDAT.PUP. + 3: Plug the USB stick into your PS3 + 4: Navigate to Settings Tab + 5: Choose System Update + 6: Choose Update via Storage Media + 7: It will say it found Version 3.55 + 8: Choose OK + 9: Accept Conditions and Follow the instructions + +If the steps above did not work for you, then you are probably on 3.55 already. +You will have to do a recovery menu mode installation: + + 1: Plug a USB stick into your computer + 2: Copy the custom firmware file that you downloaded to a USB memory + stick as /PS3/UPDATE/PS3UPDAT.PUP. + 3: Plug the USB stick into your PS3 + 4: Power down the PS3 through the menu + 5: Now press and HOLD the power button, the system will startup and shutdown + again + 6: Release the power button, then press & HOLD power again, you'll hear one + beep + followed by two consecutive beeps + 7: Release power then follow the on-screen instructions. You're now in the + recovery menu + 8: Connect the USB device and select "System Update." + 9: Accept Conditions and Follow the instructions + +-- Installation Instructions -- + +Now you've completed the firmware upgrade you are ready to install +sacd-ripper.pkg. + +In order for the PS3 BluRay player to authenticate the SACD disc and to decode +DST to DSD two SPU isoself modules will be extracted from the system. In order +to do so you must give the SACD-Ripper the PS3 keys so it can extract them +automatically. + +Get the PS3 keys from https://github.com/Mamdooh/PS3keys and put these in the +root of an USB disc. They will be asked for during first time installation, +after that you can remove the keys from your USB disc. + +-- Build Instructions -- + +To compile you will need the psl1ght suite. If you want to compile on a windows +environment I advice you to follow the CygWin installation as the MingW +installation is unstable. + +When psl1ght has been properly setup you need to configure SACD-Ripper with the +following commands: + + 1. svn checkout http://sacd-ripper.googlecode.com/svn/trunk/ sacd-ripper + 2. cd sacd-ripper + 3. sh configure + 4. make + +SACD-Ripper should compile without errors and warnings. Once completed you +should have the sacd-ripper.pkg package that can be installed on your PS3. + +To compile the Windows scarletbook tool: + 1. Open the Visual Studio Command prompt + 2. Change directory to libs\libiconv + 3. run: "nmake -f Makefile.msvc NO_NLS=1" + 4. now you can compile using the MSVC project file + +-- Information -- + +SACD-Ripper supports the following output formats: + + - 2ch DSDIFF (DSD) + - 2ch DSDIFF (DST) (if already DST encoded) + - 2ch DSF (DSD) + - mch DSDIFF (DSD) + - mch DSDIFF (DST) + - mch DSF (DSD) + - ISO (due to the 4GB FAT32 size limit on the PS3, files will be splitted when + larger) + +At this time of writing both Saracon and Audiogate do not support DST encoded +files. Audiogate only supports 2ch files and Saracon does not support DSF +files. Please keep that in mind before selecting your file output. + +There seems to be a SACD BluRay read speed limit that sets the maximum read +speed to 2.6MB/sec, yes I agree, this is slow! But DST decoding is even +slower.. The PS3 GameOS has 6 SPUs available for user operations. SACD-Ripper +uses 1 SPU for decryption and the other 5!! for DST decoding. Although this +process is quite optimal the current decoding speed has been measured to +be 0.9MB/sec for a 2 channel rip. So for 2ch DST tracks the write speed to disc +will be around 2.3MB/sec, for a multi-channel the write speed is a bit higher +at 2.4MB.sec but decoding is even slower at 0.6MB/sec. + +Big thanks goes to to: + + Graf Chokolo + Geoffrey Levand :-) + Max + vfalks + Patrick diff --git a/src/exit_handler.c b/src/exit_handler.c new file mode 100644 index 00000000..2da8019e --- /dev/null +++ b/src/exit_handler.c @@ -0,0 +1,70 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include + +#include "rsxutil.h" +#include "exit_handler.h" + +static int receive_exit_request = 0; + +static void sysutil_exit_callback(u64 status, u64 param, void *usrdata) +{ + switch (status) + { + case SYSUTIL_EXIT_GAME: + receive_exit_request = 1; + break; + case SYSUTIL_DRAW_BEGIN: + case SYSUTIL_DRAW_END: + break; + default: + break; + } +} + +static void program_exit_callback() +{ + sysUtilUnregisterCallback(SYSUTIL_EVENT_SLOT0); + + gcmSetWaitFlip(context); + rsxFinish(context, 1); +} + +int initialize_exit_handlers() +{ + int ret; + + ret = atexit(program_exit_callback); + if (ret != 0) + return ret; + + ret = sysUtilRegisterCallback(SYSUTIL_EVENT_SLOT0, sysutil_exit_callback, NULL); + if (ret != 0) + return ret; + + return 0; +} + +int user_requested_exit() +{ + return receive_exit_request; +} diff --git a/src/exit_handler.h b/src/exit_handler.h new file mode 100644 index 00000000..dcc52ecd --- /dev/null +++ b/src/exit_handler.h @@ -0,0 +1,28 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _EXIT_HANDLER_H__ +#define _EXIT_HANDLER_H__ + +int initialize_exit_handlers(); +int user_requested_exit(); + +#endif /* _EXIT_HANDLER_H__ */ diff --git a/src/install.c b/src/install.c new file mode 100644 index 00000000..0647a687 --- /dev/null +++ b/src/install.c @@ -0,0 +1,296 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include + +#include +#include + +#include "rsxutil.h" +#include "exit_handler.h" + +static const char FILE_SACD_PLUGIN_SOURCE[] = "/dev_flash/vsh/module/sacd_plugin.sprx"; +static const char FILE_SAC_MODULE_SOURCE[] = "/dev_flash/vsh/module/SacModule.spu.isoself"; +static const char FILE_SAC_MODULE[] = "/dev_hdd0/game/SACDRIP01/USRDIR/sac_module.spu.elf"; +static const char FILE_DECODER[] = "/dev_hdd0/game/SACDRIP01/USRDIR/decoder.spu.elf"; + +static int install_sac_module(void) +{ +#if 0 + FILE *in = NULL; + FILE *out = NULL; + self_ehdr_t self; + app_info_t app_info; + elf_ehdr_t elf; + elf_phdr_t *phdr = NULL; + elf_shdr_t *shdr = NULL; + section_info_t *section_info = NULL; + sceversion_info_t sceversion_info; + control_info_t *control_info = NULL; + metadata_info_t metadata_info; + metadata_header_t metadata_header; + metadata_section_header_t *section_headers = NULL; + uint8_t *keys = NULL; + signature_info_t signature_info; + signature_t signature; + self_section_t *sections = NULL; + int num_sections = 0, ret; + int i; + uint8_t *isoself_data; + size_t isoself_size; + + in = fopen(FILE_SAC_MODULE_SOURCE, "rb"); + if (in == NULL) + { + return -1; + } + + ret = self_read_headers(in, &self, &app_info, &elf, &phdr, &shdr, + §ion_info, &sceversion_info, &control_info); + + if (ret != 0) + goto fail; + + ret = self_read_metadata(in, &self, &app_info, &metadata_info, + &metadata_header, §ion_headers, &keys, + &signature_info, &signature); + + if (ret != 0) + goto fail; + + num_sections = self_load_sections(in, &self, &elf, &phdr, + &metadata_header, §ion_headers, &keys, §ions); + + if (num_sections <= 0) + goto fail; + + out = fopen(FILE_SAC_MODULE, "wb"); + if (out == NULL) + { + return -1; + } + + for (i = 0; i < num_sections; i++) + { + fseek(out, (long) sections[i].offset, SEEK_SET); + if (fwrite(sections[i].data, 1, (size_t) sections[i].size, out) != sections[i].size) + { + return -1; + } + } + fclose(out); + fclose(in); + self_free_sections(§ions, num_sections); + + return 0; + + fail: + + fclose(in); + self_free_sections(§ions, num_sections); + + return -1; +#else + return unself(FILE_SAC_MODULE_SOURCE, FILE_SAC_MODULE); +#endif +} + +static int install_decoder_module(void) +{ + FILE *in = NULL; + FILE *out = NULL; + self_ehdr_t self; + app_info_t app_info; + elf_ehdr_t elf; + elf_phdr_t *phdr = NULL; + elf_shdr_t *shdr = NULL; + section_info_t *section_info = NULL; + sceversion_info_t sceversion_info; + control_info_t *control_info = NULL; + metadata_info_t metadata_info; + metadata_header_t metadata_header; + metadata_section_header_t *section_headers = NULL; + uint8_t *keys = NULL; + signature_info_t signature_info; + signature_t signature; + self_section_t *sections = NULL; + int num_sections = 0, ret; + uint8_t *isoself_data; + size_t isoself_size; + + in = fopen(FILE_SACD_PLUGIN_SOURCE, "rb"); + if (in == NULL) + { + return -1; + } + + ret = self_read_headers(in, &self, &app_info, &elf, &phdr, &shdr, + §ion_info, &sceversion_info, &control_info); + + if (ret != 0) + goto fail; + + ret = self_read_metadata(in, &self, &app_info, &metadata_info, + &metadata_header, §ion_headers, &keys, + &signature_info, &signature); + + if (ret != 0) + goto fail; + + num_sections = self_load_sections(in, &self, &elf, &phdr, + &metadata_header, §ion_headers, &keys, §ions); + + isoself_size = find_isoself(sections, num_sections, "decoder.spu", &isoself_data); + if (isoself_size) + { + out = fopen(FILE_DECODER, "wb"); + if (out == NULL) + { + return -1; + } + fwrite(isoself_data, isoself_size, 1, out); + fclose(out); + } + + fclose(in); + + self_free_sections(§ions, num_sections); + + if (!isoself_size) + return -1; + + return 0; + + fail: + + fclose(in); + self_free_sections(§ions, num_sections); + + return -1; +} + +int dialog_action; + +static void dialog_handler(msgButton button, void *user_data) +{ + switch (button) + { + case MSG_DIALOG_BTN_OK: + dialog_action = 1; + break; + case MSG_DIALOG_BTN_NO: + case MSG_DIALOG_BTN_ESCAPE: + dialog_action = 2; + break; + case MSG_DIALOG_BTN_NONE: + dialog_action = -1; + break; + default: + break; + } +} + +static int has_all_modules_installed(void) +{ + FILE *in = NULL; + + in = fopen(FILE_DECODER, "rb"); + if (in == NULL) + { + fclose(in); + return -1; + } + + in = fopen(FILE_SAC_MODULE, "rb"); + if (in == NULL) + { + fclose(in); + return -1; + } + + return 0; +} + +int install_modules(void) +{ + msgType dialogType; + int installed; + + if (has_all_modules_installed() != 0) + { + do + { + dialogType = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK); + msgDialogOpen2(dialogType, "The SACD authentication and DST decoder modules need to be extracted.\n" + "Make sure you have the PS3 keys (app-pub-355, iso-iv-355, etc..) in the" + " root of an external USB/flash disc." + , dialog_handler, NULL, NULL); + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + if (user_requested_exit()) + return 1; + + if (dialog_action != 1) + return -1; + + installed = (install_sac_module() == 0 && install_decoder_module() == 0); + + if (installed) + { + dialogType = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialogType, "The modules were successfully extracted.", dialog_handler, NULL, NULL); + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + } + else + { + dialogType = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK); + msgDialogOpen2(dialogType, "ERROR: The keys were not found or the modules could not be extracted.\n" + "Please try again." + , dialog_handler, NULL, NULL); + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + if (dialog_action != 1) + return -1; + } + } while (!installed && !user_requested_exit()); + } + + return 0; +} diff --git a/src/install.h b/src/install.h new file mode 100644 index 00000000..c83e3553 --- /dev/null +++ b/src/install.h @@ -0,0 +1,27 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _INSTALL_H__ +#define _INSTALL_H__ + +int install_modules(void); + +#endif /* _INSTALL_H__ */ diff --git a/src/main.c b/src/main.c new file mode 100644 index 00000000..0ccbd56d --- /dev/null +++ b/src/main.c @@ -0,0 +1,620 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "rsxutil.h" +#include "exit_handler.h" +#include "install.h" +#include "output_device.h" +#include "ripping.h" + +#include + +#define MAX_PHYSICAL_SPU 6 +#define MAX_RAW_SPU 1 + +static int dialog_action = 0; +static int bd_contains_sacd_disc = -1; // information about the current disc +static int bd_disc_changed = -1; // when a disc has changed this is set to zero +static int loaded_modules = 0; +static int output_format = 6; // default to ISO +static int output_format_changed = 0; +static int current_ripping_flags = 0; +static char message_output[150]; +static char message_info[450]; + +static const int output_format_options[7] = +{ + RIP_2CH | RIP_DSDIFF, // 2ch DSD/DSDIFF + RIP_2CH | RIP_DSDIFF | RIP_2CH_DST , // 2ch DST/DSDIFF + RIP_2CH | RIP_DSF, // 2ch DSD/DSF + + RIP_MCH | RIP_DSDIFF, // mch DSD/DSDIFF + RIP_MCH | RIP_DSDIFF | RIP_MCH_DST, // mch DST/DSDIFF + RIP_MCH | RIP_DSF, // mch DSD/DSF + + RIP_ISO // ISO +}; + +static void validate_output_format(void) +{ + // skip over to MCH format? + if (output_format == 0 && !(current_ripping_flags & RIP_2CH)) + output_format += 3; + + // skip over DST/DSDIFF format? + if (output_format == 1 && !(current_ripping_flags & RIP_2CH_DST)) + output_format++; + + // skip over to ISO format? + if (output_format == 3 && !(current_ripping_flags & RIP_MCH)) + output_format += 3; +} + +static int load_modules(void) +{ + int ret; + + ret = sysModuleLoad(SYSMODULE_FS); + if (ret != 0) + return ret; + else + loaded_modules |= 1; + + ret = sysModuleLoad(SYSMODULE_IO); + if (ret != 0) + return ret; + else + loaded_modules |= 2; + + ret = sysModuleLoad(SYSMODULE_GCM_SYS); + if (ret != 0) + return ret; + else + loaded_modules |= 4; + + return ret; +} + +static int unload_modules(void) +{ + if (loaded_modules & 4) + sysModuleUnload(SYSMODULE_GCM_SYS); + + if (loaded_modules & 2) + sysModuleUnload(SYSMODULE_IO); + + if (loaded_modules & 1) + sysModuleUnload(SYSMODULE_FS); + + return 0; +} + +int file_simple_save(const char *filePath, void *buf, unsigned int fileSize) +{ + int ret; + int fd; + uint64_t writelen; + + if (buf == NULL) + { + LOG(lm_main, LOG_ERROR, ("buffer is null\n")); + } + + ret = sysFsOpen(filePath, SYS_O_WRONLY | SYS_O_CREAT | SYS_O_TRUNC, &fd, NULL, 0); + if ((ret != 0)) // && (ret != EPERM) ){ + { + LOG(lm_main, LOG_ERROR, ("file %s open error : 0x%x\n", filePath, ret)); + return -1; + } + + ret = sysFsWrite(fd, buf, fileSize, &writelen); + if (ret != 0 || fileSize != writelen) + { + LOG(lm_main, LOG_ERROR, ("file %s read error : 0x%x\n", filePath, ret)); + sysFsClose(fd); + return -1; + } + + ret = sysFsClose(fd); + if (ret != 0) + { + LOG(lm_main, LOG_ERROR, ("file %s close error : 0x%x\n", filePath, ret)); + return -1; + } + + return 0; +} + +static void dialog_handler(msgButton button, void *usrData) +{ + switch (button) + { + case MSG_DIALOG_BTN_OK: + dialog_action = 1; + break; + case MSG_DIALOG_BTN_NO: + case MSG_DIALOG_BTN_ESCAPE: + dialog_action = 2; + break; + case MSG_DIALOG_BTN_NONE: + dialog_action = -1; + break; + default: + break; + } +} + +int patch_lv1_ss_services(void) +{ + install_new_poke(); + + // Try to map lv1 + if (!map_lv1()) + { + remove_new_poke(); + return -1; + } + + lv1poke(0x0016f3b8, 0x7f83e37860000000ULL); // 0x7f83e378f8010098ULL + lv1poke(0x0016f3dc, 0x7f85e37838600001ULL); // 0x7f85e3784bfff0e5ULL + lv1poke(0x0016f454, 0x7f84e3783be00001ULL); // 0x7f84e37838a10070ULL + lv1poke(0x0016f45c, 0x9be1007038600000ULL); // 0x9be1007048005fa5ULL + + remove_new_poke(); + + // unmap lv1 + unmap_lv1(); + + return 0; +} + +int unpatch_lv1_ss_services(void) +{ + install_new_poke(); + + // Try to map lv1 + if (!map_lv1()) + { + remove_new_poke(); + return -1; + } + + lv1poke(0x0016f3b8, 0x7f83e378f8010098ULL); + lv1poke(0x0016f3dc, 0x7f85e3784bfff0e5ULL); + lv1poke(0x0016f454, 0x7f84e37838a10070ULL); + lv1poke(0x0016f45c, 0x9be1007048005fa5ULL); + + remove_new_poke(); + + // unmap lv1 + unmap_lv1(); + + return 0; +} + +int patch_syscall_864(void) +{ + const uint64_t addr = 0x80000000002D7820ULL; // 3.55 addr location + uint8_t access_rights = lv2peek(addr) >> 56; + if (access_rights == 0x20) + { + lv2poke(addr, (uint64_t) 0x40 << 56); + } + else if (access_rights != 0x40) + { + return -1; + } + return 0; +} + +static void bd_eject_disc_callback(void) +{ + LOG(lm_main, LOG_NOTICE, ("disc ejected..")); + bd_contains_sacd_disc = -1; + bd_disc_changed = -1; +} + +static void bd_insert_disc_callback(uint32_t disc_type, char *title_id) +{ + LOG(lm_main, LOG_NOTICE, ("disc inserted..")); + bd_disc_changed = 1; + + if (disc_type == SYS_DISCTYPE_PS3) + { + // cannot do anything with a PS3 disc.. + bd_contains_sacd_disc = 0; + } + else + { + // unknown disc + bd_contains_sacd_disc = 1; + } +} + +void main_loop(void) +{ + msgType dialog_type; + char *message = (char *) malloc(512); + sacd_reader_t *sacd_reader; + scarletbook_handle_t *sb_handle = 0; + int idx = 0; + + if (output_device_changed && output_device) + { + char file_path[100]; + sprintf(file_path, "%s/sacd_log.txt", output_device); + set_log_file(file_path); + LOG(lm_main, LOG_NOTICE, ("SACD-Ripper Version " SACD_RIPPER_VERSION_STRING)); + } + + // did the disc change? + if (bd_contains_sacd_disc && bd_disc_changed) + { + // open the BD device + sacd_reader = sacd_open("/dev_bdvd"); + if (sacd_reader) + { + // read the scarletbook information + sb_handle = scarletbook_open(sacd_reader, 0); + if (sb_handle) + { + master_text_t *master_text = &sb_handle->master_text; + master_toc_t *mtoc = sb_handle->master_toc; + + if (master_text->disc_title || master_text->disc_title_phonetic) + { + idx += snprintf(message_info + idx, 60, "Title: %s\n", substr((master_text->disc_title ? master_text->disc_title : master_text->disc_title_phonetic), 0, 50)); + LOG(lm_main, LOG_NOTICE, ("Album Title: %s", substr((master_text->disc_title ? master_text->disc_title : master_text->disc_title_phonetic), 0, 50))); + } + + if (message_info[idx - 1] != '\n') { message_info[idx++] = '\n'; message_info[idx] = '\0'; } + + if (master_text->disc_artist || master_text->disc_artist_phonetic) + { + idx += snprintf(message_info + idx, 60, "Artist: %s\n", substr((master_text->disc_artist ? master_text->disc_artist : master_text->disc_artist_phonetic), 0, 50)); + LOG(lm_main, LOG_NOTICE, ("Album Artist: %s", substr((master_text->disc_artist ? master_text->disc_artist : master_text->disc_artist_phonetic), 0, 50))); + } + + if (message_info[idx - 1] != '\n') { message_info[idx++] = '\n'; message_info[idx] = '\0'; } + + idx += snprintf(message_info + idx, 20, "Version: %02i.%02i\n", mtoc->version.major, mtoc->version.minor); + LOG(lm_main, LOG_NOTICE, ("Disc Version: %02i.%02i\n", mtoc->version.major, mtoc->version.minor)); + idx += snprintf(message_info + idx, 25, "Created: %4i-%02i-%02i\n", mtoc->disc_date_year, mtoc->disc_date_month, mtoc->disc_date_day); + + idx += snprintf(message_info + idx, 15, "Area 0:\n"); + idx += snprintf(message_info + idx, 35, " Speakers: %s\n", get_speaker_config_string(sb_handle->area[0].area_toc)); + idx += snprintf(message_info + idx, 35, " Encoding: %s\n", get_frame_format_string(sb_handle->area[0].area_toc)); + idx += snprintf(message_info + idx, 25, " Tracks: %d (%.2fGB)\n", sb_handle->area[0].area_toc->track_count, ((double) (sb_handle->area[0].area_toc->track_end - sb_handle->area[0].area_toc->track_start) * SACD_LSN_SIZE) / 1073741824.00); + if (has_both_channels(sb_handle)) + { + idx += snprintf(message_info + idx, 2, "\n"); + idx += snprintf(message_info + idx, 15, "Area 1:\n"); + idx += snprintf(message_info + idx, 35, " Speakers: %s\n", get_speaker_config_string(sb_handle->area[1].area_toc)); + idx += snprintf(message_info + idx, 35, " Encoding: %s\n", get_frame_format_string(sb_handle->area[1].area_toc)); + idx += snprintf(message_info + idx, 25, " Tracks: %d (%.2fGB)\n", sb_handle->area[1].area_toc->track_count, ((double) (sb_handle->area[1].area_toc->track_end - sb_handle->area[1].area_toc->track_start) * SACD_LSN_SIZE) / 1073741824.00); + } + + idx += snprintf(message_info + idx, 50, "\nclick X to start ripping, O to change output"); + + current_ripping_flags = 0; + if (has_two_channel(sb_handle)) + { + current_ripping_flags |= RIP_2CH; + if (sb_handle->area[sb_handle->twoch_area_idx].area_toc->frame_format == FRAME_FORMAT_DST) + { + current_ripping_flags |= RIP_2CH_DST; + } + } + if (has_multi_channel(sb_handle)) + { + current_ripping_flags |= RIP_MCH; + } + + // validate output format as the ripping flags have changed + output_format_changed = 1; + validate_output_format(); + + scarletbook_close(sb_handle); + sb_handle = 0; + } + else + { + bd_contains_sacd_disc = 0; + } + + // close the input device asap + sacd_close(sacd_reader); + sacd_reader = 0; + } + else + { + bd_contains_sacd_disc = 0; + } + } + + if (output_device_changed || output_format_changed) + { + // output device + if (output_device) + idx = snprintf(message_output, 35, "Output: %s %.2fGB\n", output_device, output_device_space); + else + idx = snprintf(message_output, 35, "Output: NO DEVICE\n"); + + // output format + idx += snprintf(message_output + idx, 20, "Format: "); + + switch (output_format) + { + case 0: + idx += snprintf(message_output + idx, 20, "2ch DSDIFF (DSD)\n"); + break; + case 1: + idx += snprintf(message_output + idx, 20, "2ch DSDIFF (DST)\n"); + break; + case 2: + idx += snprintf(message_output + idx, 20, "2ch DSF (DSD)\n"); + break; + case 3: + idx += snprintf(message_output + idx, 20, "mch DSDIFF (DSD)\n"); + break; + case 4: + idx += snprintf(message_output + idx, 20, "mch DSDIFF (DST)\n"); + break; + case 5: + idx += snprintf(message_output + idx, 20, "mch DSF (DSF)\n"); + break; + case 6: + idx += snprintf(message_output + idx, 20, "ISO\n"); + break; + } + idx += snprintf(message_output + idx, 2, "\n"); + } + + // by default we have no user controls + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_DISABLE_CANCEL_ON); + + if (bd_contains_sacd_disc) + { + snprintf(message, 512, "%s%s", message_output, message_info); + } + else + { + snprintf(message, 512, "The current disc is empty or not recognized as an SACD, please re-insert.\n\n%s" + , (output_device ? "" : "(Also make sure you connect an external fat32 formatted harddisk!)")); + } + + // can we start ripping? + if (bd_contains_sacd_disc) + { + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK); + } + + msgDialogOpen2(dialog_type, message, dialog_handler, NULL, NULL); + + dialog_action = 0; + bd_disc_changed = 0; + output_device_changed = 0; + output_format_changed = 0; + while (!dialog_action && !user_requested_exit() && bd_disc_changed == 0 && output_device_changed == 0) + { + // poll for new output devices + poll_output_devices(); + + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + // did user request to start the ripping process? + if (dialog_action == 1 && bd_contains_sacd_disc) + { + start_ripping_gui(output_format_options[output_format]); + + // action is handled + dialog_action = 0; + } + else if (dialog_action == 2) + { + output_format++; + + // max of 7 output options + if (output_format > 6) + { + output_format = 0; + } + + // is the current selection valid? + validate_output_format(); + + // action is handled + output_format_changed = 1; + dialog_action = 0; + } + + free(message); +} + +void show_version(void) +{ + msgType dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialog_type, "SACD-Ripper, Version " SACD_RIPPER_VERSION_STRING, dialog_handler, NULL, NULL); + msgDialogClose(5000.0f); + + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); +} + +int main(int argc, char *argv[]) +{ + int ret; + void *host_addr = memalign(1024 * 1024, HOST_SIZE); + msgType dialog_type; + + load_modules(); + + init_logging(); + + // Initialize SPUs + LOG(lm_main, LOG_DEBUG, ("Initializing SPUs\n")); + ret = sysSpuInitialize(MAX_PHYSICAL_SPU, MAX_RAW_SPU); + if (ret != 0) + { + LOG(lm_main, LOG_ERROR, ("sysSpuInitialize failed: %d\n", ret)); + goto quit; + } + + init_screen(host_addr, HOST_SIZE); + ioPadInit(7); + + ret = initialize_exit_handlers(); + if (ret != 0) + goto quit; + + show_version(); + + if (user_requested_exit()) + goto quit; + + // remove patch protection + remove_protection(); + + ret = patch_lv1_ss_services(); + if (ret < 0) + { + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialog_type, "ERROR: Couldn't patch lv1 services, returning to the XMB.\nMake sure you are running a firmware like 'kmeaw' which allows patching!", dialog_handler, NULL, NULL); + + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + goto quit; + } + + // patch syscall 864 to allow drive re-init + ret = patch_syscall_864(); + if (ret < 0) + { + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialog_type, "ERROR: Couldn't patch syscall 864, returning to the XMB.\nMake sure you are running a firmware like 'kmeaw' which allows patching!", dialog_handler, NULL, NULL); + + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + goto quit; + } + + // install the necessary modules + ret = install_modules(); + if (ret < 0) + { + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialog_type, "Installation was aborted, returning to the XMB.", dialog_handler, NULL, NULL); + + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + goto quit; + } + + if (user_requested_exit()) + goto quit; + + // reset & re-authenticate the BD drive + sys_storage_reset_bd(); + sys_storage_authenticate_bd(); + + ret = sysDiscRegisterDiscChangeCallback(&bd_eject_disc_callback, &bd_insert_disc_callback); + + // poll for an output_device + poll_output_devices(); + + while (1) + { + // main loop + main_loop(); + + // break out of the loop when requested + if (user_requested_exit()) + break; + } + + ret = sysDiscUnregisterDiscChangeCallback(); + + quit: + + unpatch_lv1_ss_services(); + + destroy_logging(); + unload_modules(); + + free(host_addr); + + return 0; +} diff --git a/src/output_device.c b/src/output_device.c new file mode 100644 index 00000000..718a394f --- /dev/null +++ b/src/output_device.c @@ -0,0 +1,97 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include + +#include "output_device.h" + +int output_device_changed = -1; +char *output_device = 0; +double output_device_space = 0; +uint64_t output_device_sectors = 0; + +int poll_output_devices(void) +{ + static const char *device_list[11] = { + "/dev_usb000", "/dev_usb001", "/dev_usb002", "/dev_usb003", + "/dev_usb004", "/dev_usb005", "/dev_usb006", "/dev_usb007", + "/dev_cf", "/dev_sd", "/dev_ms" + }; + static int old_devices; + uint32_t current_devices = 0; + char *largest_device = 0; + double largest_device_space = 0; + uint64_t largest_device_sectors = 0; + int i; + + for (i = 0; i < 11; i++) + { + sysFSStat fstatus; + if (sysFsStat(device_list[i], &fstatus) == 0) + { + current_devices |= 1 << i; + } + else + { + current_devices &= ~(1 << i); + } + } + + if (old_devices != current_devices) + { + for (i = 0; i < 11; i++) + { + if ((current_devices >> i) & 1) + { + double free_disk_space; + uint32_t block_size; + uint64_t free_block_count; + + sysFsGetFreeSize(device_list[i], &block_size, &free_block_count); + free_disk_space = (((uint64_t) block_size * free_block_count)); + free_disk_space = free_disk_space / 1073741824.00; // convert to GB + + if (free_disk_space > largest_device_space) + { + largest_device = (char *) device_list[i]; + largest_device_space = free_disk_space; + largest_device_sectors = (((uint64_t) block_size * free_block_count)) / 2048; + } + } + } + } + + if (old_devices != current_devices) + { + old_devices = current_devices; + if (output_device != largest_device) + { + output_device = largest_device; + output_device_space = largest_device_space; + output_device_sectors = largest_device_sectors; + output_device_changed = 1; + return 1; + } + } + + output_device_changed = 0; + return 0; +} diff --git a/src/output_device.h b/src/output_device.h new file mode 100644 index 00000000..4fae6967 --- /dev/null +++ b/src/output_device.h @@ -0,0 +1,42 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __OUTPUT_DEVICE_H__ +#define __OUTPUT_DEVICE_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern char *output_device; +extern double output_device_space; +extern int output_device_changed; +extern uint64_t output_device_sectors; + +int poll_output_devices(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/ripping.c b/src/ripping.c new file mode 100644 index 00000000..f50e63bd --- /dev/null +++ b/src/ripping.c @@ -0,0 +1,345 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "ripping.h" +#include "output_device.h" +#include "exit_handler.h" +#include "rsxutil.h" + +static int dialog_action = 0; + +static atomic_t stats_total_sectors; +static atomic_t stats_total_sectors_processed; +static atomic_t stats_current_file_total_sectors; // total amount of block to process +static atomic_t stats_current_file_sectors_processed; + +static atomic_t stats_current_track; +static atomic_t stats_total_tracks; + +static void dialog_handler(msgButton button, void *user_data) +{ + switch (button) + { + case MSG_DIALOG_BTN_OK: + dialog_action = 1; + break; + case MSG_DIALOG_BTN_NO: + case MSG_DIALOG_BTN_ESCAPE: + dialog_action = 2; + break; + case MSG_DIALOG_BTN_NONE: + dialog_action = -1; + break; + default: + break; + } +} + +static int check_disc_space(sacd_reader_t *sacd_reader, scarletbook_handle_t *handle, int ripping_flags) +{ + uint64_t needed_sectors = 0; + + if (ripping_flags & RIP_ISO) + { + needed_sectors = sacd_get_total_sectors(sacd_reader); + } + else if (has_two_channel(handle) && ripping_flags & RIP_2CH) + { + needed_sectors = get_two_channel(handle)->track_end - get_two_channel(handle)->track_start; + } + else if (has_both_channels(handle) && ripping_flags & RIP_MCH) + { + needed_sectors = get_multi_channel(handle)->track_end - get_multi_channel(handle)->track_start; + } + + if (needed_sectors > output_device_sectors) + { + msgType dialog_type; + char *message = (char *) malloc(512); + + LOG(lm_main, LOG_ERROR, ("no enough disc space on %s (%llu), needs: %llu", output_device, output_device_sectors, needed_sectors)); + + snprintf(message, 512, "Ripping aborted.\nYou do not have enough disc space on [%s (%.2fGB available)].", output_device, output_device_space); + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK | MSG_DIALOG_DISABLE_CANCEL_ON); + dialog_action = 0; + msgDialogOpen2(dialog_type, message, dialog_handler, NULL, NULL); + while (!user_requested_exit() && !dialog_action) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + free(message); + + return 0; + } + return 1; +} + +static void handle_status_update_track_callback(char *filename, int current_track, int total_tracks) +{ + sysAtomicSet(&stats_current_track, current_track); + sysAtomicSet(&stats_total_tracks, total_tracks); +} + +static void handle_status_update_progress_callback(uint32_t total_sectors, uint32_t total_sectors_processed, + uint32_t current_file_total_sectors, uint32_t current_file_sectors_processed) +{ + sysAtomicSet(&stats_total_sectors, total_sectors); + sysAtomicSet(&stats_total_sectors_processed, total_sectors_processed); + sysAtomicSet(&stats_current_file_total_sectors, current_file_total_sectors); + sysAtomicSet(&stats_current_file_sectors_processed, current_file_sectors_processed); +} + +int start_ripping_gui(int ripping_flags) +{ + char *albumdir, *musicfilename, *file_path = 0; + sacd_reader_t *sacd_reader; + scarletbook_handle_t *handle; + scarletbook_output_t *output; + msgType dialog_type; + int area_idx, i, ret; + + uint32_t prev_upper_progress = 0; + uint32_t prev_lower_progress = 0; + uint32_t delta; + + int prev_current_track = 0; + uint32_t prev_stats_total_sectors_processed = 0; + uint32_t prev_stats_current_file_sectors_processed = 0; + uint64_t tb_start, tb_freq; + uint64_t tmp_total_ripping_sectors = 0; + + char progress_message[64]; + + sysAtomicSet(&stats_total_sectors, 0); + sysAtomicSet(&stats_total_sectors_processed, 0); + sysAtomicSet(&stats_current_file_total_sectors, 0); + sysAtomicSet(&stats_current_file_sectors_processed, 0); + sysAtomicSet(&stats_current_track, 0); + sysAtomicSet(&stats_total_tracks, 0); + + sacd_reader = sacd_open("/dev_bdvd"); + if (sacd_reader) + { + handle = scarletbook_open(sacd_reader, 0); + + if (check_disc_space(sacd_reader, handle, ripping_flags)) + { + ret = sacd_authenticate(sacd_reader); + if (ret != 0) + { + LOG(lm_main, LOG_ERROR, ("authentication failed: %x", ret)); + } + + // select the channel area + area_idx = ((has_multi_channel(handle) && ripping_flags & RIP_MCH) || !has_two_channel(handle)) ? handle->mulch_area_idx : handle->twoch_area_idx; + + albumdir = get_album_dir(handle); + + output = scarletbook_output_create(handle, handle_status_update_track_callback, handle_status_update_progress_callback); + + if (ripping_flags & RIP_ISO) + { + #define FAT32_SECTOR_LIMIT 2090000 + uint32_t total_sectors = sacd_get_total_sectors(sacd_reader); + uint32_t sector_size = FAT32_SECTOR_LIMIT; + uint32_t sector_offset = 0; + if (total_sectors > FAT32_SECTOR_LIMIT) + { + musicfilename = (char *) malloc(512); + file_path = make_filename(output_device, 0, albumdir, "iso"); + for (i = 1; total_sectors != 0; i++) + { + sector_size = min(total_sectors, FAT32_SECTOR_LIMIT); + snprintf(musicfilename, 512, "%s.%03d", file_path, i); + scarletbook_output_enqueue_raw_sectors(output, sector_offset, sector_size, musicfilename, "iso"); + sector_offset += sector_size; + total_sectors -= sector_size; + } + free(file_path); + free(musicfilename); + } + else + { + file_path = make_filename(output_device, 0, albumdir, "iso"); + scarletbook_output_enqueue_raw_sectors(output, 0, total_sectors, file_path, "iso"); + free(file_path); + } + tmp_total_ripping_sectors = sacd_get_total_sectors(sacd_reader); + } + else + { + // do not overwrite previous dump + get_unique_dir(output_device, &albumdir); + + // fill the queue with items to rip + for (i = 0; i < handle->area[area_idx].area_toc->track_count; i++) + { + musicfilename = get_music_filename(handle, area_idx, i); + if (ripping_flags & RIP_DSF) + { + file_path = make_filename(output_device, albumdir, musicfilename, "dsf"); + scarletbook_output_enqueue_track(output, area_idx, i, file_path, "dsf", + 1, /* always decode to DSD */ + 0 /* gapless mode is turned off */); + } + else if (ripping_flags & RIP_DSDIFF) + { + file_path = make_filename(output_device, albumdir, musicfilename, "dff"); + scarletbook_output_enqueue_track(output, area_idx, i, file_path, "dsdiff", + ((ripping_flags & RIP_2CH_DST || ripping_flags & RIP_MCH_DST) ? 0 : 1), + 0 /* gapless mode is turned off */); + } + + tmp_total_ripping_sectors += handle->area[area_idx].area_tracklist_offset->track_length_lsn[i]; + + free(musicfilename); + free(file_path); + } + + file_path = make_filename(output_device, albumdir, 0, 0); + LOG(lm_main, LOG_NOTICE, ("setting output folder to: %s", file_path)); + recursive_mkdir(file_path, 0777); + free(file_path); + } + + scarletbook_output_start(output); + + tb_freq = sysGetTimebaseFrequency(); + tb_start = __gettime(); + + { + char *message = (char *) malloc(512); + + file_path = make_filename(output_device, albumdir, 0, 0); + snprintf(message, 512, "Title: %s\nOutput: %s\nFormat: %s\nSize: %.2fGB\nArea: %s\nEncoding: %s", + substr(albumdir, 0, 100), + file_path, + (ripping_flags & RIP_DSDIFF ? "DSDIFF" : (ripping_flags & RIP_DSF ? "DSF" : "ISO")), + ((double) ((tmp_total_ripping_sectors * SACD_LSN_SIZE) / 1073741824.00)), + (ripping_flags & RIP_2CH ? "2ch" : "mch"), + (ripping_flags & RIP_2CH_DST || ripping_flags & RIP_MCH_DST ? "DST" : (ripping_flags & RIP_ISO ? "DECRYPTED" : "DSD")) + ); + free(file_path); + + dialog_action = 0; + dialog_type = MSG_DIALOG_MUTE_ON | MSG_DIALOG_DOUBLE_PROGRESSBAR; + msgDialogOpen2(dialog_type, message, dialog_handler, NULL, NULL); + while (!user_requested_exit() && dialog_action == 0 && scarletbook_output_is_busy(output)) + { + uint32_t tmp_stats_total_sectors_processed = sysAtomicRead(&stats_total_sectors_processed); + uint32_t tmp_stats_total_sectors = sysAtomicRead(&stats_total_sectors); + uint32_t tmp_stats_current_file_sectors_processed = sysAtomicRead(&stats_current_file_sectors_processed); + uint32_t tmp_stats_current_file_total_sectors = sysAtomicRead(&stats_current_file_total_sectors); + int tmp_current_track = sysAtomicRead(&stats_current_track); + + if (tmp_current_track != 0 && tmp_current_track != prev_current_track) + { + memset(progress_message, 0, 64); + + musicfilename = get_music_filename(handle, area_idx, tmp_current_track - 1); + // HACK: substr is not thread safe, but it's only used in this thread.. + snprintf(progress_message, 63, "Track (%d/%d): [%s...]", tmp_current_track, sysAtomicRead(&stats_total_tracks), substr(musicfilename, 0, 40)); + free(musicfilename); + + msgDialogProgressBarReset(MSG_PROGRESSBAR_INDEX0); + msgDialogProgressBarSetMsg(MSG_PROGRESSBAR_INDEX1, progress_message); + prev_upper_progress = 0; + prev_stats_current_file_sectors_processed = 0; + + prev_current_track = tmp_current_track; + } + + if (tmp_stats_total_sectors != 0 && prev_stats_total_sectors_processed != tmp_stats_total_sectors_processed) + { + delta = (tmp_stats_current_file_sectors_processed + (tmp_stats_current_file_sectors_processed - prev_stats_current_file_sectors_processed)) * 100 / tmp_stats_current_file_total_sectors - prev_upper_progress; + prev_upper_progress += delta; + msgDialogProgressBarInc(MSG_PROGRESSBAR_INDEX0, delta); + + delta = (tmp_stats_total_sectors_processed + (tmp_stats_total_sectors_processed - prev_stats_total_sectors_processed)) * 100 / tmp_stats_total_sectors - prev_lower_progress; + prev_lower_progress += delta; + msgDialogProgressBarInc(MSG_PROGRESSBAR_INDEX1, delta); + + snprintf(progress_message, 64, "Ripping %.1fMB/%.1fMB at %.2fMB/sec", + ((float)(tmp_stats_current_file_sectors_processed * SACD_LSN_SIZE) / 1048576.00), + ((float)(tmp_stats_current_file_total_sectors * SACD_LSN_SIZE) / 1048576.00), + (float)((float) tmp_stats_total_sectors_processed * SACD_LSN_SIZE / 1048576.00) / (float)((__gettime() - tb_start) / (float)(tb_freq))); + + msgDialogProgressBarSetMsg(MSG_PROGRESSBAR_INDEX0, progress_message); + + prev_stats_total_sectors_processed = tmp_stats_total_sectors_processed; + prev_stats_current_file_sectors_processed = tmp_stats_current_file_sectors_processed; + } + + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + free(message); + } + free(albumdir); + + scarletbook_output_destroy(output); + } + scarletbook_close(handle); + } + sacd_close(sacd_reader); + + if (user_requested_exit()) + { + return 0; + } + else if (1) + { + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialog_type, "ripping process completed.", dialog_handler, NULL, NULL); + + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + } + + return 0; +} diff --git a/src/ripping.h b/src/ripping.h new file mode 100644 index 00000000..15d37341 --- /dev/null +++ b/src/ripping.h @@ -0,0 +1,49 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __RIPPING_H__ +#define __RIPPING_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum +{ + RIP_2CH = 1 << 0, + RIP_2CH_DST = 1 << 1, + RIP_MCH = 1 << 2, + RIP_MCH_DST = 1 << 3, + + RIP_DSDIFF = 1 << 4, + RIP_DSF = 1 << 5, + RIP_ISO = 1 << 6 +}; + +int start_ripping_gui(int); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/rsxutil.c b/src/rsxutil.c new file mode 100644 index 00000000..0002189e --- /dev/null +++ b/src/rsxutil.c @@ -0,0 +1,173 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include + +#include "rsxutil.h" + +#define GCM_LABEL_INDEX 255 + +videoResolution res; +gcmContextData *context = NULL; + +u32 curr_fb = 0; +u32 first_fb = 1; + +u32 display_width; +u32 display_height; + +u32 depth_pitch; +u32 depth_offset; +u32 *depth_buffer; + +u32 color_pitch; +u32 color_offset[2]; +u32 *color_buffer[2]; + +static u32 sLabelVal = 1; + +static void wait_finish() +{ + rsxSetWriteBackendLabel(context, GCM_LABEL_INDEX, sLabelVal); + + rsxFlushBuffer(context); + + while (*(vu32 *) gcmGetLabelAddress(GCM_LABEL_INDEX) != sLabelVal) + usleep(30); + + ++sLabelVal; +} + +static void wait_rsx_idle() +{ + rsxSetWriteBackendLabel(context, GCM_LABEL_INDEX, sLabelVal); + rsxSetWaitLabel(context, GCM_LABEL_INDEX, sLabelVal); + + ++sLabelVal; + + wait_finish(); +} + +void set_render_target(u32 index) +{ + gcmSurface sf; + + sf.colorFormat = GCM_TF_COLOR_X8R8G8B8; + sf.colorTarget = GCM_TF_TARGET_0; + sf.colorLocation[0] = GCM_LOCATION_RSX; + sf.colorOffset[0] = color_offset[index]; + sf.colorPitch[0] = color_pitch; + + sf.colorLocation[1] = GCM_LOCATION_RSX; + sf.colorLocation[2] = GCM_LOCATION_RSX; + sf.colorLocation[3] = GCM_LOCATION_RSX; + sf.colorOffset[1] = 0; + sf.colorOffset[2] = 0; + sf.colorOffset[3] = 0; + sf.colorPitch[1] = 64; + sf.colorPitch[2] = 64; + sf.colorPitch[3] = 64; + + sf.depthFormat = GCM_TF_ZETA_Z16; + sf.depthLocation = GCM_LOCATION_RSX; + sf.depthOffset = depth_offset; + sf.depthPitch = depth_pitch; + + sf.type = GCM_TF_TYPE_LINEAR; + sf.antiAlias = GCM_TF_CENTER_1; + + sf.width = display_width; + sf.height = display_height; + sf.x = 0; + sf.y = 0; + + rsxSetSurface(context, &sf); +} + +void init_screen(void *host_addr, u32 size) +{ + context = rsxInit(CB_SIZE, size, host_addr); + + videoState state; + videoGetState(0, 0, &state); + + videoGetResolution(state.displayMode.resolution, &res); + + videoConfiguration vconfig; + memset(&vconfig, 0, sizeof(videoConfiguration)); + + vconfig.resolution = state.displayMode.resolution; + vconfig.format = VIDEO_BUFFER_FORMAT_XRGB; + vconfig.pitch = res.width * sizeof(u32); + + wait_rsx_idle(); + + videoConfigure(0, &vconfig, NULL, 0); + videoGetState(0, 0, &state); + + gcmSetFlipMode(GCM_FLIP_VSYNC); + + display_width = res.width; + display_height = res.height; + + color_pitch = display_width * sizeof(u32); + color_buffer[0] = (u32 *) rsxMemalign(64, (display_height * color_pitch)); + color_buffer[1] = (u32 *) rsxMemalign(64, (display_height * color_pitch)); + + rsxAddressToOffset(color_buffer[0], &color_offset[0]); + rsxAddressToOffset(color_buffer[1], &color_offset[1]); + + gcmSetDisplayBuffer(0, color_offset[0], color_pitch, display_width, display_height); + gcmSetDisplayBuffer(1, color_offset[1], color_pitch, display_width, display_height); + + depth_pitch = display_width * sizeof(u32); + depth_buffer = (u32 *) rsxMemalign(64, (display_height * depth_pitch) * 2); + rsxAddressToOffset(depth_buffer, &depth_offset); +} + +void waitflip() +{ + while (gcmGetFlipStatus() != 0) + usleep(200); + gcmResetFlipStatus(); +} + +void flip() +{ + if (!first_fb) + waitflip(); + else + gcmResetFlipStatus(); + + gcmSetFlip(context, curr_fb); + rsxFlushBuffer(context); + + gcmSetWaitFlip(context); + + curr_fb ^= 1; + set_render_target(curr_fb); + + first_fb = 0; +} diff --git a/src/rsxutil.h b/src/rsxutil.h new file mode 100644 index 00000000..9b287a74 --- /dev/null +++ b/src/rsxutil.h @@ -0,0 +1,49 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __RSXUTIL_H__ +#define __RSXUTIL_H__ + +#include +#include + +#define CB_SIZE 0x100000 +#define HOST_SIZE (32 * 1024 * 1024) + +#ifdef __cplusplus +extern "C" { +#endif + +extern gcmContextData *context; +extern u32 display_width; +extern u32 display_height; +extern u32 curr_fb; + +void set_render_target(u32 index); +void init_screen(void *host_addr, u32 size); +void waitflip(); +void flip(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/todo b/todo new file mode 100644 index 00000000..3d7ce75f --- /dev/null +++ b/todo @@ -0,0 +1,19 @@ +TODO + +version 0.3.x + + - logging + - cleanup logging, split lm_main into multiple destinations + - write log along each consecutive rip + - write INFO,NOTICE,etc.. + - the log should contain more information: + - date/time + - output format (ISO, mch DSDIFF (DSD), etc.) + - add option to embed sac_module & decoder + - use output_format_t.error_number for error handling + - catch read failures + - do not stop and continue decoding and reading + - specify max amount of read errors + - skipping DST/DSD frames + - skip TOCs + - log read errors diff --git a/tools/Makefile b/tools/Makefile new file mode 100644 index 00000000..55aaeb92 --- /dev/null +++ b/tools/Makefile @@ -0,0 +1,7 @@ +TARGETS := analysis_dump sacd_daemon + +all: + @for TARGET in $(TARGETS); do $(MAKE) --no-print-directory -C $$TARGET; done + +clean: + @for TARGET in $(TARGETS); do $(MAKE) --no-print-directory -C $$TARGET clean; done diff --git a/tools/analysis_dump/Makefile b/tools/analysis_dump/Makefile new file mode 100644 index 00000000..16c205aa --- /dev/null +++ b/tools/analysis_dump/Makefile @@ -0,0 +1,147 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(PSL1GHT)),) +$(error "Please set PSL1GHT in your environment. export PSL1GHT=") +endif + +include $(PSL1GHT)/ppu_rules + +TITLE := SACD-Analysis Dumper +APPID := SACDDMP01 +CONTENTID := UP0001-$(APPID)_00-0000000000000000 +SFOXML := ../bin/sfo.xml +ICON0 := ../bin/ICON0.PNG + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +TARGETS := +BUILD := build +SOURCES := src +DATA := +INCLUDES := src ../../libs/libpatchutils ../../libs/libcommon + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -O2 -Wall -mcpu=cell $(MACHDEP) $(INCLUDE) -DAPPID=$(APPID) +CXXFLAGS = $(CFLAGS) + +LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lrsx -lgcm_sys -lio -lsysmodule -lsysutil -lrt -llv2 -lm -lpatchutils -lsysfs -lcommon + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) ../../../libs/libpatchutils ../../../libs/libcommon + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +export BUILDDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES), -I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + $(LIBPSL1GHT_INC) \ + -I$(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + $(LIBPSL1GHT_LIB) + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @for TARGET in $(TARGETS); do $(MAKE) --no-print-directory -C $$TARGET; done + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @for TARGET in $(TARGETS); do $(MAKE) --no-print-directory -C $$TARGET clean; done + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).self + +#--------------------------------------------------------------------------------- +run: + ps3load $(OUTPUT).self + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).pkg: $(OUTPUT).self +$(OUTPUT).self: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .bin extension +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/tools/analysis_dump/bin/ICON0.PNG b/tools/analysis_dump/bin/ICON0.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d08f541285be6e10c6e9e530e9ac54df9e0ec694 GIT binary patch literal 29431 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

ig0z@5;hv(Mp`W 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 literal 0 HcmV?d00001 diff --git a/tools/analysis_dump/bin/sfo.xml b/tools/analysis_dump/bin/sfo.xml new file mode 100644 index 00000000..dfa14546 --- /dev/null +++ b/tools/analysis_dump/bin/sfo.xml @@ -0,0 +1,34 @@ + + + 00.10 + + 0 + + + 1 + + + HG + + + This application was created with the official non-official SDK called PSL1GHT, for more information visit http://www.psl1ght.com/ . This is in no way associated with Sony Computer Entertainment Inc., please do not contact them for help, they will not be able to provide it. + + + 0 + + + 03.5500 + + + 63 + + + 279 + + + SACD-Analysis Dumper + + + SACDDMP01 + + diff --git a/tools/analysis_dump/src/exit_handler.c b/tools/analysis_dump/src/exit_handler.c new file mode 100644 index 00000000..2da8019e --- /dev/null +++ b/tools/analysis_dump/src/exit_handler.c @@ -0,0 +1,70 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include + +#include "rsxutil.h" +#include "exit_handler.h" + +static int receive_exit_request = 0; + +static void sysutil_exit_callback(u64 status, u64 param, void *usrdata) +{ + switch (status) + { + case SYSUTIL_EXIT_GAME: + receive_exit_request = 1; + break; + case SYSUTIL_DRAW_BEGIN: + case SYSUTIL_DRAW_END: + break; + default: + break; + } +} + +static void program_exit_callback() +{ + sysUtilUnregisterCallback(SYSUTIL_EVENT_SLOT0); + + gcmSetWaitFlip(context); + rsxFinish(context, 1); +} + +int initialize_exit_handlers() +{ + int ret; + + ret = atexit(program_exit_callback); + if (ret != 0) + return ret; + + ret = sysUtilRegisterCallback(SYSUTIL_EVENT_SLOT0, sysutil_exit_callback, NULL); + if (ret != 0) + return ret; + + return 0; +} + +int user_requested_exit() +{ + return receive_exit_request; +} diff --git a/tools/analysis_dump/src/exit_handler.h b/tools/analysis_dump/src/exit_handler.h new file mode 100644 index 00000000..dcc52ecd --- /dev/null +++ b/tools/analysis_dump/src/exit_handler.h @@ -0,0 +1,28 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _EXIT_HANDLER_H__ +#define _EXIT_HANDLER_H__ + +int initialize_exit_handlers(); +int user_requested_exit(); + +#endif /* _EXIT_HANDLER_H__ */ diff --git a/tools/analysis_dump/src/main.c b/tools/analysis_dump/src/main.c new file mode 100644 index 00000000..6baf2346 --- /dev/null +++ b/tools/analysis_dump/src/main.c @@ -0,0 +1,466 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "rsxutil.h" +#include "exit_handler.h" +#include "output_device.h" + +#include + +#define MAX_PHYSICAL_SPU 6 +#define MAX_RAW_SPU 1 + +static int dialog_action = 0; +static int bd_contains_sacd_disc = -1; // information about the current disc +static int bd_disc_changed = -1; // when a disc has changed this is set to zero +static int loaded_modules = 0; + +static int load_modules(void) +{ + int ret; + + ret = sysModuleLoad(SYSMODULE_FS); + if (ret != 0) + return ret; + else + loaded_modules |= 1; + + ret = sysModuleLoad(SYSMODULE_IO); + if (ret != 0) + return ret; + else + loaded_modules |= 2; + + ret = sysModuleLoad(SYSMODULE_GCM_SYS); + if (ret != 0) + return ret; + else + loaded_modules |= 4; + + return ret; +} + +static int unload_modules(void) +{ + if (loaded_modules & 4) + sysModuleUnload(SYSMODULE_GCM_SYS); + + if (loaded_modules & 2) + sysModuleUnload(SYSMODULE_IO); + + if (loaded_modules & 1) + sysModuleUnload(SYSMODULE_FS); + + return 0; +} + +int file_simple_save(const char *filePath, void *buf, unsigned int fileSize) +{ + int ret; + int fd; + uint64_t writelen; + + if (buf == NULL) + { + LOG(lm_main, LOG_ERROR, ("buffer is null\n")); + } + + ret = sysFsOpen(filePath, SYS_O_WRONLY | SYS_O_CREAT | SYS_O_TRUNC, &fd, NULL, 0); + if ((ret != 0)) // && (ret != EPERM) ){ + { + LOG(lm_main, LOG_ERROR, ("file %s open error : 0x%x\n", filePath, ret)); + return -1; + } + + ret = sysFsWrite(fd, buf, fileSize, &writelen); + if (ret != 0 || fileSize != writelen) + { + LOG(lm_main, LOG_ERROR, ("file %s read error : 0x%x\n", filePath, ret)); + sysFsClose(fd); + return -1; + } + + ret = sysFsClose(fd); + if (ret != 0) + { + LOG(lm_main, LOG_ERROR, ("file %s close error : 0x%x\n", filePath, ret)); + return -1; + } + + return 0; +} + +static void dialog_handler(msgButton button, void *usrData) +{ + switch (button) + { + case MSG_DIALOG_BTN_OK: + dialog_action = 1; + break; + case MSG_DIALOG_BTN_NO: + case MSG_DIALOG_BTN_ESCAPE: + dialog_action = 2; + break; + case MSG_DIALOG_BTN_NONE: + dialog_action = -1; + break; + default: + break; + } +} + +int patch_lv1_ss_services(void) +{ + install_new_poke(); + + // Try to map lv1 + if (!map_lv1()) + { + remove_new_poke(); + return -1; + } + + lv1poke(0x0016f3b8, 0x7f83e37860000000ULL); // 0x7f83e378f8010098ULL + lv1poke(0x0016f3dc, 0x7f85e37838600001ULL); // 0x7f85e3784bfff0e5ULL + lv1poke(0x0016f454, 0x7f84e3783be00001ULL); // 0x7f84e37838a10070ULL + lv1poke(0x0016f45c, 0x9be1007038600000ULL); // 0x9be1007048005fa5ULL + + remove_new_poke(); + + // unmap lv1 + unmap_lv1(); + + return 0; +} + +int unpatch_lv1_ss_services(void) +{ + install_new_poke(); + + // Try to map lv1 + if (!map_lv1()) + { + remove_new_poke(); + return -1; + } + + lv1poke(0x0016f3b8, 0x7f83e378f8010098ULL); + lv1poke(0x0016f3dc, 0x7f85e3784bfff0e5ULL); + lv1poke(0x0016f454, 0x7f84e37838a10070ULL); + lv1poke(0x0016f45c, 0x9be1007048005fa5ULL); + + remove_new_poke(); + + // unmap lv1 + unmap_lv1(); + + return 0; +} + +int patch_syscall_864(void) +{ + const uint64_t addr = 0x80000000002D7820ULL; // 3.55 addr location + uint8_t access_rights = lv2peek(addr) >> 56; + if (access_rights == 0x20) + { + lv2poke(addr, (uint64_t) 0x40 << 56); + } + else if (access_rights != 0x40) + { + return -1; + } + return 0; +} + +void dump_sample_to_output_device(void) +{ + msgType dialog_type; + int fd_in, ret; + int fd_out; + uint32_t sectors_read; + uint64_t writelen; + char *file_path = (char *) malloc(100); + char *message = (char *) malloc(512); + + sprintf(file_path, "%s/sacd_analysis.bin", output_device); + + ret = sysFsOpen(file_path, SYS_O_WRONLY | SYS_O_CREAT | SYS_O_TRUNC, &fd_out, NULL, 0); + + sysFsChmod(file_path, S_IFMT | 0777); + + if (fd_out) + { + uint8_t *buffer = (uint8_t *) malloc(1024 * 2048); + + ret = sys_storage_open(BD_DEVICE, &fd_in); + LOG(lm_main, LOG_DEBUG, ("sys storage_open %x %x\n", ret, fd_in)); + if (ret == 0) + { + ret = sys_storage_read(fd_in, 0, 1024, buffer, §ors_read); + + LOG(lm_main, LOG_DEBUG, ("sys storage_read %x %x %x\n", ret, fd_in, sectors_read)); + + sysFsWrite(fd_out, buffer, 1024 * 2048, &writelen); + + ret = sys_storage_close(fd_in); + LOG(lm_main, LOG_DEBUG, ("sys storage_close %x %x\n", ret, fd_in)); + + } + free(buffer); + sysFsClose(fd_out); + } + + snprintf(message, 512, "Dump analysis has been written to: [%s]", file_path); + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialog_type, message, NULL, NULL, NULL); + + bd_disc_changed = 0; + while (!user_requested_exit() && bd_disc_changed == 0) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + free(file_path); + free(message); +} + +static void bd_eject_disc_callback(void) +{ + bd_contains_sacd_disc = -1; + bd_disc_changed = -1; +} + +static void bd_insert_disc_callback(uint32_t disc_type, char *title_id) +{ + bd_disc_changed = 1; + + if (disc_type == SYS_DISCTYPE_PS3) + { + // cannot do anything with a PS3 disc.. + bd_contains_sacd_disc = 0; + } + else + { + // unknown disc + bd_contains_sacd_disc = 1; + } +} + +void main_loop(void) +{ + msgType dialog_type; + char *message = (char *) malloc(512); + + if (output_device_changed && output_device) + { + char file_path[100]; + sprintf(file_path, "%s/sacd_log.txt", output_device); + set_log_file(file_path); + } + + // did the disc change? + if (bd_contains_sacd_disc && bd_disc_changed) + { + bd_contains_sacd_disc = 0; + } + + // by default we have no user controls + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_DISABLE_CANCEL_ON); + + if (!bd_contains_sacd_disc) + { + // was the disc changed since startup? + if (bd_disc_changed == -1 || !output_device) + { + snprintf(message, 512, "Please insert a disc.\n\n%s" + , (output_device ? "" : "(Also make sure you connect an external fat32 formatted harddisk!)")); + } + else + { + snprintf(message, 512, "Would you like to RAW dump the first 2Mb to [%s (%.2fGB available)] for analysis?", + output_device, output_device_space); + + dialog_type |= MSG_DIALOG_BTN_TYPE_OK; + } + } + + msgDialogOpen2(dialog_type, message, dialog_handler, NULL, NULL); + + dialog_action = 0; + bd_disc_changed = 0; + output_device_changed = 0; + while (!dialog_action && !user_requested_exit() && bd_disc_changed == 0 && output_device_changed == 0) + { + // poll for new output devices + poll_output_devices(); + + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + // user wants to dump 2Mb to output device + if (dialog_action == 1 && !bd_contains_sacd_disc) + { + dump_sample_to_output_device(); + + // action is handled + dialog_action = 0; + } + + free(message); +} + +int main(int argc, char *argv[]) +{ + int ret; + void *host_addr = memalign(1024 * 1024, HOST_SIZE); + msgType dialog_type; + + load_modules(); + + init_logging(); + + // Initialize SPUs + LOG(lm_main, LOG_DEBUG, ("Initializing SPUs\n")); + ret = sysSpuInitialize(MAX_PHYSICAL_SPU, MAX_RAW_SPU); + if (ret != 0) + { + LOG(lm_main, LOG_ERROR, ("sysSpuInitialize failed: %d\n", ret)); + goto quit; + } + + init_screen(host_addr, HOST_SIZE); + ioPadInit(7); + + ret = initialize_exit_handlers(); + if (ret != 0) + goto quit; + + // remove patch protection + remove_protection(); + + ret = patch_lv1_ss_services(); + if (ret < 0) + { + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialog_type, "ERROR: Couldn't patch lv1 services, returning to the XMB.\nMake sure you are running a firmware like 'kmeaw' which allows patching!", dialog_handler, NULL, NULL); + + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + goto quit; + } + + // patch syscall 864 to allow drive re-init + ret = patch_syscall_864(); + if (ret < 0) + { + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialog_type, "ERROR: Couldn't patch syscall 864, returning to the XMB.\nMake sure you are running a firmware like 'kmeaw' which allows patching!", dialog_handler, NULL, NULL); + + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + goto quit; + } + + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialog_type, "Make sure the drive is empty!", dialog_handler, NULL, NULL); + + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + if (user_requested_exit()) + goto quit; + + // reset & re-authenticate the BD drive + sys_storage_reset_bd(); + sys_storage_authenticate_bd(); + + ret = sysDiscRegisterDiscChangeCallback(&bd_eject_disc_callback, &bd_insert_disc_callback); + + // poll for an output_device + poll_output_devices(); + + while (1) + { + // main loop + main_loop(); + + // break out of the loop when requested + if (user_requested_exit()) + break; + } + + ret = sysDiscUnregisterDiscChangeCallback(); + + quit: + + unpatch_lv1_ss_services(); + + destroy_logging(); + unload_modules(); + + free(host_addr); + + return 0; +} diff --git a/tools/analysis_dump/src/output_device.c b/tools/analysis_dump/src/output_device.c new file mode 100644 index 00000000..718a394f --- /dev/null +++ b/tools/analysis_dump/src/output_device.c @@ -0,0 +1,97 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include + +#include "output_device.h" + +int output_device_changed = -1; +char *output_device = 0; +double output_device_space = 0; +uint64_t output_device_sectors = 0; + +int poll_output_devices(void) +{ + static const char *device_list[11] = { + "/dev_usb000", "/dev_usb001", "/dev_usb002", "/dev_usb003", + "/dev_usb004", "/dev_usb005", "/dev_usb006", "/dev_usb007", + "/dev_cf", "/dev_sd", "/dev_ms" + }; + static int old_devices; + uint32_t current_devices = 0; + char *largest_device = 0; + double largest_device_space = 0; + uint64_t largest_device_sectors = 0; + int i; + + for (i = 0; i < 11; i++) + { + sysFSStat fstatus; + if (sysFsStat(device_list[i], &fstatus) == 0) + { + current_devices |= 1 << i; + } + else + { + current_devices &= ~(1 << i); + } + } + + if (old_devices != current_devices) + { + for (i = 0; i < 11; i++) + { + if ((current_devices >> i) & 1) + { + double free_disk_space; + uint32_t block_size; + uint64_t free_block_count; + + sysFsGetFreeSize(device_list[i], &block_size, &free_block_count); + free_disk_space = (((uint64_t) block_size * free_block_count)); + free_disk_space = free_disk_space / 1073741824.00; // convert to GB + + if (free_disk_space > largest_device_space) + { + largest_device = (char *) device_list[i]; + largest_device_space = free_disk_space; + largest_device_sectors = (((uint64_t) block_size * free_block_count)) / 2048; + } + } + } + } + + if (old_devices != current_devices) + { + old_devices = current_devices; + if (output_device != largest_device) + { + output_device = largest_device; + output_device_space = largest_device_space; + output_device_sectors = largest_device_sectors; + output_device_changed = 1; + return 1; + } + } + + output_device_changed = 0; + return 0; +} diff --git a/tools/analysis_dump/src/output_device.h b/tools/analysis_dump/src/output_device.h new file mode 100644 index 00000000..4fae6967 --- /dev/null +++ b/tools/analysis_dump/src/output_device.h @@ -0,0 +1,42 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __OUTPUT_DEVICE_H__ +#define __OUTPUT_DEVICE_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern char *output_device; +extern double output_device_space; +extern int output_device_changed; +extern uint64_t output_device_sectors; + +int poll_output_devices(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tools/analysis_dump/src/rsxutil.c b/tools/analysis_dump/src/rsxutil.c new file mode 100644 index 00000000..0002189e --- /dev/null +++ b/tools/analysis_dump/src/rsxutil.c @@ -0,0 +1,173 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include + +#include "rsxutil.h" + +#define GCM_LABEL_INDEX 255 + +videoResolution res; +gcmContextData *context = NULL; + +u32 curr_fb = 0; +u32 first_fb = 1; + +u32 display_width; +u32 display_height; + +u32 depth_pitch; +u32 depth_offset; +u32 *depth_buffer; + +u32 color_pitch; +u32 color_offset[2]; +u32 *color_buffer[2]; + +static u32 sLabelVal = 1; + +static void wait_finish() +{ + rsxSetWriteBackendLabel(context, GCM_LABEL_INDEX, sLabelVal); + + rsxFlushBuffer(context); + + while (*(vu32 *) gcmGetLabelAddress(GCM_LABEL_INDEX) != sLabelVal) + usleep(30); + + ++sLabelVal; +} + +static void wait_rsx_idle() +{ + rsxSetWriteBackendLabel(context, GCM_LABEL_INDEX, sLabelVal); + rsxSetWaitLabel(context, GCM_LABEL_INDEX, sLabelVal); + + ++sLabelVal; + + wait_finish(); +} + +void set_render_target(u32 index) +{ + gcmSurface sf; + + sf.colorFormat = GCM_TF_COLOR_X8R8G8B8; + sf.colorTarget = GCM_TF_TARGET_0; + sf.colorLocation[0] = GCM_LOCATION_RSX; + sf.colorOffset[0] = color_offset[index]; + sf.colorPitch[0] = color_pitch; + + sf.colorLocation[1] = GCM_LOCATION_RSX; + sf.colorLocation[2] = GCM_LOCATION_RSX; + sf.colorLocation[3] = GCM_LOCATION_RSX; + sf.colorOffset[1] = 0; + sf.colorOffset[2] = 0; + sf.colorOffset[3] = 0; + sf.colorPitch[1] = 64; + sf.colorPitch[2] = 64; + sf.colorPitch[3] = 64; + + sf.depthFormat = GCM_TF_ZETA_Z16; + sf.depthLocation = GCM_LOCATION_RSX; + sf.depthOffset = depth_offset; + sf.depthPitch = depth_pitch; + + sf.type = GCM_TF_TYPE_LINEAR; + sf.antiAlias = GCM_TF_CENTER_1; + + sf.width = display_width; + sf.height = display_height; + sf.x = 0; + sf.y = 0; + + rsxSetSurface(context, &sf); +} + +void init_screen(void *host_addr, u32 size) +{ + context = rsxInit(CB_SIZE, size, host_addr); + + videoState state; + videoGetState(0, 0, &state); + + videoGetResolution(state.displayMode.resolution, &res); + + videoConfiguration vconfig; + memset(&vconfig, 0, sizeof(videoConfiguration)); + + vconfig.resolution = state.displayMode.resolution; + vconfig.format = VIDEO_BUFFER_FORMAT_XRGB; + vconfig.pitch = res.width * sizeof(u32); + + wait_rsx_idle(); + + videoConfigure(0, &vconfig, NULL, 0); + videoGetState(0, 0, &state); + + gcmSetFlipMode(GCM_FLIP_VSYNC); + + display_width = res.width; + display_height = res.height; + + color_pitch = display_width * sizeof(u32); + color_buffer[0] = (u32 *) rsxMemalign(64, (display_height * color_pitch)); + color_buffer[1] = (u32 *) rsxMemalign(64, (display_height * color_pitch)); + + rsxAddressToOffset(color_buffer[0], &color_offset[0]); + rsxAddressToOffset(color_buffer[1], &color_offset[1]); + + gcmSetDisplayBuffer(0, color_offset[0], color_pitch, display_width, display_height); + gcmSetDisplayBuffer(1, color_offset[1], color_pitch, display_width, display_height); + + depth_pitch = display_width * sizeof(u32); + depth_buffer = (u32 *) rsxMemalign(64, (display_height * depth_pitch) * 2); + rsxAddressToOffset(depth_buffer, &depth_offset); +} + +void waitflip() +{ + while (gcmGetFlipStatus() != 0) + usleep(200); + gcmResetFlipStatus(); +} + +void flip() +{ + if (!first_fb) + waitflip(); + else + gcmResetFlipStatus(); + + gcmSetFlip(context, curr_fb); + rsxFlushBuffer(context); + + gcmSetWaitFlip(context); + + curr_fb ^= 1; + set_render_target(curr_fb); + + first_fb = 0; +} diff --git a/tools/analysis_dump/src/rsxutil.h b/tools/analysis_dump/src/rsxutil.h new file mode 100644 index 00000000..9b287a74 --- /dev/null +++ b/tools/analysis_dump/src/rsxutil.h @@ -0,0 +1,49 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __RSXUTIL_H__ +#define __RSXUTIL_H__ + +#include +#include + +#define CB_SIZE 0x100000 +#define HOST_SIZE (32 * 1024 * 1024) + +#ifdef __cplusplus +extern "C" { +#endif + +extern gcmContextData *context; +extern u32 display_width; +extern u32 display_height; +extern u32 curr_fb; + +void set_render_target(u32 index); +void init_screen(void *host_addr, u32 size); +void waitflip(); +void flip(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tools/sacd_daemon/Makefile b/tools/sacd_daemon/Makefile new file mode 100644 index 00000000..7f41a3dd --- /dev/null +++ b/tools/sacd_daemon/Makefile @@ -0,0 +1,148 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(PSL1GHT)),) +$(error "Please set PSL1GHT in your environment. export PSL1GHT=") +endif + +include $(PSL1GHT)/ppu_rules + +TITLE := SACD Daemon +APPID := SACDDAE01 +CONTENTID := UP0001-$(APPID)_00-0000000000000000 +SFOXML := ../bin/sfo.xml +ICON0 := ../bin/ICON0.PNG + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +TARGETS := +BUILD := build +SOURCES := src +DATA := +INCLUDES := src ../../libs/libpatchutils ../../libs/libcommon ../../libs/libsacd + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -O2 -Wall -mcpu=cell $(MACHDEP) $(INCLUDE) -DAPPID=$(APPID) +CXXFLAGS = $(CFLAGS) + +LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lrsx -lgcm_sys -lio -lsysmodule -lsysutil -lrt -llv2 -lm -lpatchutils -lsysfs -lsacd -lcommon -lnet -lnetctl -liconv + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) ../../../libs/libpatchutils ../../../libs/libcommon ../../../libs/libsacd + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +export BUILDDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES), -I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + $(LIBPSL1GHT_INC) \ + -I$(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L../../../libs/libiconv/lib/.libs/ \ + $(LIBPSL1GHT_LIB) + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @for TARGET in $(TARGETS); do $(MAKE) --no-print-directory -C $$TARGET; done + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @for TARGET in $(TARGETS); do $(MAKE) --no-print-directory -C $$TARGET clean; done + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).self + +#--------------------------------------------------------------------------------- +run: + ps3load $(OUTPUT).self + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).pkg: $(OUTPUT).self +$(OUTPUT).self: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .bin extension +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/tools/sacd_daemon/bin/ICON0.PNG b/tools/sacd_daemon/bin/ICON0.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f01f4df0975f9d6f31ca08b931124892c2052ac5 GIT binary patch literal 31641 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%0AQO37T{zWnu$x$4ZIQgq1gCImE7`Xw9?T~Lv8 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 + + 00.10 + + 0 + + + 1 + + + HG + + + This application was created with the official non-official SDK called PSL1GHT, for more information visit http://www.psl1ght.com/ . This is in no way associated with Sony Computer Entertainment Inc., please do not contact them for help, they will not be able to provide it. + + + 0 + + + 03.5500 + + + 63 + + + 279 + + + SACD Daemon + + + SACDDAE01 + + diff --git a/tools/sacd_daemon/src/exit_handler.c b/tools/sacd_daemon/src/exit_handler.c new file mode 100644 index 00000000..2da8019e --- /dev/null +++ b/tools/sacd_daemon/src/exit_handler.c @@ -0,0 +1,70 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include + +#include "rsxutil.h" +#include "exit_handler.h" + +static int receive_exit_request = 0; + +static void sysutil_exit_callback(u64 status, u64 param, void *usrdata) +{ + switch (status) + { + case SYSUTIL_EXIT_GAME: + receive_exit_request = 1; + break; + case SYSUTIL_DRAW_BEGIN: + case SYSUTIL_DRAW_END: + break; + default: + break; + } +} + +static void program_exit_callback() +{ + sysUtilUnregisterCallback(SYSUTIL_EVENT_SLOT0); + + gcmSetWaitFlip(context); + rsxFinish(context, 1); +} + +int initialize_exit_handlers() +{ + int ret; + + ret = atexit(program_exit_callback); + if (ret != 0) + return ret; + + ret = sysUtilRegisterCallback(SYSUTIL_EVENT_SLOT0, sysutil_exit_callback, NULL); + if (ret != 0) + return ret; + + return 0; +} + +int user_requested_exit() +{ + return receive_exit_request; +} diff --git a/tools/sacd_daemon/src/exit_handler.h b/tools/sacd_daemon/src/exit_handler.h new file mode 100644 index 00000000..dcc52ecd --- /dev/null +++ b/tools/sacd_daemon/src/exit_handler.h @@ -0,0 +1,28 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _EXIT_HANDLER_H__ +#define _EXIT_HANDLER_H__ + +int initialize_exit_handlers(); +int user_requested_exit(); + +#endif /* _EXIT_HANDLER_H__ */ diff --git a/tools/sacd_daemon/src/main.c b/tools/sacd_daemon/src/main.c new file mode 100644 index 00000000..dd0fb7f2 --- /dev/null +++ b/tools/sacd_daemon/src/main.c @@ -0,0 +1,408 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include "rsxutil.h" +#include "exit_handler.h" +#include "server.h" +#ifdef ENABLE_LOGGING +#include "output_device.h" +#endif + +#include +#include + +#define MAX_PHYSICAL_SPU 6 +#define MAX_RAW_SPU 1 + +static int dialog_action = 0; +static int bd_contains_sacd_disc = -1; // information about the current disc +static int bd_disc_changed = -1; // when a disc has changed this is set to zero +static int loaded_modules = 0; + +static int load_modules(void) +{ + int ret; + + ret = sysModuleLoad(SYSMODULE_FS); + if (ret != 0) + return ret; + else + loaded_modules |= 1; + + ret = sysModuleLoad(SYSMODULE_IO); + if (ret != 0) + return ret; + else + loaded_modules |= 2; + + ret = sysModuleLoad(SYSMODULE_GCM_SYS); + if (ret != 0) + return ret; + else + loaded_modules |= 4; + + return ret; +} + +static int unload_modules(void) +{ + if (loaded_modules & 4) + sysModuleUnload(SYSMODULE_GCM_SYS); + + if (loaded_modules & 2) + sysModuleUnload(SYSMODULE_IO); + + if (loaded_modules & 1) + sysModuleUnload(SYSMODULE_FS); + + return 0; +} + +int file_simple_save(const char *filePath, void *buf, unsigned int fileSize) +{ + int ret; + int fd; + uint64_t writelen; + + if (buf == NULL) + { + LOG(lm_main, LOG_ERROR, ("buffer is null\n")); + } + + ret = sysFsOpen(filePath, SYS_O_WRONLY | SYS_O_CREAT | SYS_O_TRUNC, &fd, NULL, 0); + if ((ret != 0)) // && (ret != EPERM) ){ + { + LOG(lm_main, LOG_ERROR, ("file %s open error : 0x%x\n", filePath, ret)); + return -1; + } + + ret = sysFsWrite(fd, buf, fileSize, &writelen); + if (ret != 0 || fileSize != writelen) + { + LOG(lm_main, LOG_ERROR, ("file %s read error : 0x%x\n", filePath, ret)); + sysFsClose(fd); + return -1; + } + + ret = sysFsClose(fd); + if (ret != 0) + { + LOG(lm_main, LOG_ERROR, ("file %s close error : 0x%x\n", filePath, ret)); + return -1; + } + + return 0; +} + +static void dialog_handler(msgButton button, void *usrData) +{ + switch (button) + { + case MSG_DIALOG_BTN_OK: + dialog_action = 1; + break; + case MSG_DIALOG_BTN_NO: + case MSG_DIALOG_BTN_ESCAPE: + dialog_action = 2; + break; + case MSG_DIALOG_BTN_NONE: + dialog_action = -1; + break; + default: + break; + } +} + +int patch_lv1_ss_services(void) +{ + install_new_poke(); + + // Try to map lv1 + if (!map_lv1()) + { + remove_new_poke(); + return -1; + } + + lv1poke(0x0016f3b8, 0x7f83e37860000000ULL); // 0x7f83e378f8010098ULL + lv1poke(0x0016f3dc, 0x7f85e37838600001ULL); // 0x7f85e3784bfff0e5ULL + lv1poke(0x0016f454, 0x7f84e3783be00001ULL); // 0x7f84e37838a10070ULL + lv1poke(0x0016f45c, 0x9be1007038600000ULL); // 0x9be1007048005fa5ULL + + remove_new_poke(); + + // unmap lv1 + unmap_lv1(); + + return 0; +} + +int unpatch_lv1_ss_services(void) +{ + install_new_poke(); + + // Try to map lv1 + if (!map_lv1()) + { + remove_new_poke(); + return -1; + } + + lv1poke(0x0016f3b8, 0x7f83e378f8010098ULL); + lv1poke(0x0016f3dc, 0x7f85e3784bfff0e5ULL); + lv1poke(0x0016f454, 0x7f84e37838a10070ULL); + lv1poke(0x0016f45c, 0x9be1007048005fa5ULL); + + remove_new_poke(); + + // unmap lv1 + unmap_lv1(); + + return 0; +} + +int patch_syscall_864(void) +{ + const uint64_t addr = 0x80000000002D7820ULL; // 3.55 addr location + uint8_t access_rights = lv2peek(addr) >> 56; + if (access_rights == 0x20) + { + lv2poke(addr, (uint64_t) 0x40 << 56); + } + else if (access_rights != 0x40) + { + return -1; + } + return 0; +} + +static void bd_eject_disc_callback(void) +{ + bd_contains_sacd_disc = -1; + bd_disc_changed = -1; +} + +static void bd_insert_disc_callback(uint32_t disc_type, char *title_id) +{ + bd_disc_changed = 1; + + if (disc_type == SYS_DISCTYPE_PS3) + { + // cannot do anything with a PS3 disc.. + bd_contains_sacd_disc = 0; + } + else + { + // unknown disc + bd_contains_sacd_disc = 1; + } +} + +void main_loop(void) +{ + int client_connected; + msgType dialog_type; + char *message = (char *) malloc(512); + + // did the disc change? + if (bd_contains_sacd_disc && bd_disc_changed) + { + bd_contains_sacd_disc = 0; + } + + // by default we have no user controls + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_DISABLE_CANCEL_ON); + + if (!bd_contains_sacd_disc) + { + union net_ctl_info info; + + if(netCtlGetInfo(NET_CTL_INFO_IP_ADDRESS, &info) == 0) + { + sprintf(message, " SACD Daemon %s\n\n" + "Status: Active\n" + "IP Address: %s (port 2002)\n" + "Client: %s\n" + "Disc: %s", + SACD_RIPPER_VERSION_STRING, info.ip_address, + (is_client_connected() ? "connected" : "none"), + (bd_disc_changed == -1 ? "empty" : "inserted")); + } + else + { + sprintf(message, "No active network connection was detected.\n\nPress OK to refresh."); + dialog_type |= MSG_DIALOG_BTN_TYPE_OK; + } + } + + msgDialogOpen2(dialog_type, message, dialog_handler, NULL, NULL); + + dialog_action = 0; + bd_disc_changed = 0; + client_connected = is_client_connected(); + while (!dialog_action && !user_requested_exit() && bd_disc_changed == 0 && client_connected == is_client_connected()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + free(message); +} + +int main(int argc, char *argv[]) +{ + int ret; + void *host_addr = memalign(1024 * 1024, HOST_SIZE); + msgType dialog_type; + sys_ppu_thread_t id; // start server thread + + load_modules(); + + init_logging(); + + netInitialize(); + netCtlInit(); + + // Initialize SPUs + LOG(lm_main, LOG_DEBUG, ("Initializing SPUs\n")); + ret = sysSpuInitialize(MAX_PHYSICAL_SPU, MAX_RAW_SPU); + if (ret != 0) + { + LOG(lm_main, LOG_ERROR, ("sysSpuInitialize failed: %d\n", ret)); + goto quit; + } + + init_screen(host_addr, HOST_SIZE); + ioPadInit(7); + + ret = initialize_exit_handlers(); + if (ret != 0) + goto quit; + + // remove patch protection + remove_protection(); + + ret = patch_lv1_ss_services(); + if (ret < 0) + { + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialog_type, "ERROR: Couldn't patch lv1 services, returning to the XMB.\nMake sure you are running a firmware like 'kmeaw' which allows patching!", dialog_handler, NULL, NULL); + + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + goto quit; + } + + // patch syscall 864 to allow drive re-init + ret = patch_syscall_864(); + if (ret < 0) + { + dialog_type = (MSG_DIALOG_NORMAL | MSG_DIALOG_BTN_TYPE_OK | MSG_DIALOG_DISABLE_CANCEL_ON); + msgDialogOpen2(dialog_type, "ERROR: Couldn't patch syscall 864, returning to the XMB.\nMake sure you are running a firmware like 'kmeaw' which allows patching!", dialog_handler, NULL, NULL); + + dialog_action = 0; + while (!dialog_action && !user_requested_exit()) + { + sysUtilCheckCallback(); + flip(); + } + msgDialogAbort(); + + goto quit; + } + + // reset & re-authenticate the BD drive + sys_storage_reset_bd(); + sys_storage_authenticate_bd(); + + ret = sysDiscRegisterDiscChangeCallback(&bd_eject_disc_callback, &bd_insert_disc_callback); + +#ifdef ENABLE_LOGGING + // poll for an output_device + poll_output_devices(); + + if (output_device) + { + char file_path[100]; + sprintf(file_path, "%s/daemon_log.txt", output_device); + set_log_file(file_path); + } +#endif + + sysThreadCreate(&id, listener_thread, NULL, 1500, 0x400, 0, "listener"); + + while (1) + { + // main loop + main_loop(); + + // break out of the loop when requested + if (user_requested_exit()) + break; + } + + ret = sysDiscUnregisterDiscChangeCallback(); + + quit: + + unpatch_lv1_ss_services(); + + destroy_logging(); + netDeinitialize(); + unload_modules(); + + free(host_addr); + + return 0; +} diff --git a/tools/sacd_daemon/src/output_device.c b/tools/sacd_daemon/src/output_device.c new file mode 100644 index 00000000..718a394f --- /dev/null +++ b/tools/sacd_daemon/src/output_device.c @@ -0,0 +1,97 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include + +#include "output_device.h" + +int output_device_changed = -1; +char *output_device = 0; +double output_device_space = 0; +uint64_t output_device_sectors = 0; + +int poll_output_devices(void) +{ + static const char *device_list[11] = { + "/dev_usb000", "/dev_usb001", "/dev_usb002", "/dev_usb003", + "/dev_usb004", "/dev_usb005", "/dev_usb006", "/dev_usb007", + "/dev_cf", "/dev_sd", "/dev_ms" + }; + static int old_devices; + uint32_t current_devices = 0; + char *largest_device = 0; + double largest_device_space = 0; + uint64_t largest_device_sectors = 0; + int i; + + for (i = 0; i < 11; i++) + { + sysFSStat fstatus; + if (sysFsStat(device_list[i], &fstatus) == 0) + { + current_devices |= 1 << i; + } + else + { + current_devices &= ~(1 << i); + } + } + + if (old_devices != current_devices) + { + for (i = 0; i < 11; i++) + { + if ((current_devices >> i) & 1) + { + double free_disk_space; + uint32_t block_size; + uint64_t free_block_count; + + sysFsGetFreeSize(device_list[i], &block_size, &free_block_count); + free_disk_space = (((uint64_t) block_size * free_block_count)); + free_disk_space = free_disk_space / 1073741824.00; // convert to GB + + if (free_disk_space > largest_device_space) + { + largest_device = (char *) device_list[i]; + largest_device_space = free_disk_space; + largest_device_sectors = (((uint64_t) block_size * free_block_count)) / 2048; + } + } + } + } + + if (old_devices != current_devices) + { + old_devices = current_devices; + if (output_device != largest_device) + { + output_device = largest_device; + output_device_space = largest_device_space; + output_device_sectors = largest_device_sectors; + output_device_changed = 1; + return 1; + } + } + + output_device_changed = 0; + return 0; +} diff --git a/tools/sacd_daemon/src/output_device.h b/tools/sacd_daemon/src/output_device.h new file mode 100644 index 00000000..4fae6967 --- /dev/null +++ b/tools/sacd_daemon/src/output_device.h @@ -0,0 +1,42 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __OUTPUT_DEVICE_H__ +#define __OUTPUT_DEVICE_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern char *output_device; +extern double output_device_space; +extern int output_device_changed; +extern uint64_t output_device_sectors; + +int poll_output_devices(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tools/sacd_daemon/src/rsxutil.c b/tools/sacd_daemon/src/rsxutil.c new file mode 100644 index 00000000..0002189e --- /dev/null +++ b/tools/sacd_daemon/src/rsxutil.c @@ -0,0 +1,173 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include + +#include "rsxutil.h" + +#define GCM_LABEL_INDEX 255 + +videoResolution res; +gcmContextData *context = NULL; + +u32 curr_fb = 0; +u32 first_fb = 1; + +u32 display_width; +u32 display_height; + +u32 depth_pitch; +u32 depth_offset; +u32 *depth_buffer; + +u32 color_pitch; +u32 color_offset[2]; +u32 *color_buffer[2]; + +static u32 sLabelVal = 1; + +static void wait_finish() +{ + rsxSetWriteBackendLabel(context, GCM_LABEL_INDEX, sLabelVal); + + rsxFlushBuffer(context); + + while (*(vu32 *) gcmGetLabelAddress(GCM_LABEL_INDEX) != sLabelVal) + usleep(30); + + ++sLabelVal; +} + +static void wait_rsx_idle() +{ + rsxSetWriteBackendLabel(context, GCM_LABEL_INDEX, sLabelVal); + rsxSetWaitLabel(context, GCM_LABEL_INDEX, sLabelVal); + + ++sLabelVal; + + wait_finish(); +} + +void set_render_target(u32 index) +{ + gcmSurface sf; + + sf.colorFormat = GCM_TF_COLOR_X8R8G8B8; + sf.colorTarget = GCM_TF_TARGET_0; + sf.colorLocation[0] = GCM_LOCATION_RSX; + sf.colorOffset[0] = color_offset[index]; + sf.colorPitch[0] = color_pitch; + + sf.colorLocation[1] = GCM_LOCATION_RSX; + sf.colorLocation[2] = GCM_LOCATION_RSX; + sf.colorLocation[3] = GCM_LOCATION_RSX; + sf.colorOffset[1] = 0; + sf.colorOffset[2] = 0; + sf.colorOffset[3] = 0; + sf.colorPitch[1] = 64; + sf.colorPitch[2] = 64; + sf.colorPitch[3] = 64; + + sf.depthFormat = GCM_TF_ZETA_Z16; + sf.depthLocation = GCM_LOCATION_RSX; + sf.depthOffset = depth_offset; + sf.depthPitch = depth_pitch; + + sf.type = GCM_TF_TYPE_LINEAR; + sf.antiAlias = GCM_TF_CENTER_1; + + sf.width = display_width; + sf.height = display_height; + sf.x = 0; + sf.y = 0; + + rsxSetSurface(context, &sf); +} + +void init_screen(void *host_addr, u32 size) +{ + context = rsxInit(CB_SIZE, size, host_addr); + + videoState state; + videoGetState(0, 0, &state); + + videoGetResolution(state.displayMode.resolution, &res); + + videoConfiguration vconfig; + memset(&vconfig, 0, sizeof(videoConfiguration)); + + vconfig.resolution = state.displayMode.resolution; + vconfig.format = VIDEO_BUFFER_FORMAT_XRGB; + vconfig.pitch = res.width * sizeof(u32); + + wait_rsx_idle(); + + videoConfigure(0, &vconfig, NULL, 0); + videoGetState(0, 0, &state); + + gcmSetFlipMode(GCM_FLIP_VSYNC); + + display_width = res.width; + display_height = res.height; + + color_pitch = display_width * sizeof(u32); + color_buffer[0] = (u32 *) rsxMemalign(64, (display_height * color_pitch)); + color_buffer[1] = (u32 *) rsxMemalign(64, (display_height * color_pitch)); + + rsxAddressToOffset(color_buffer[0], &color_offset[0]); + rsxAddressToOffset(color_buffer[1], &color_offset[1]); + + gcmSetDisplayBuffer(0, color_offset[0], color_pitch, display_width, display_height); + gcmSetDisplayBuffer(1, color_offset[1], color_pitch, display_width, display_height); + + depth_pitch = display_width * sizeof(u32); + depth_buffer = (u32 *) rsxMemalign(64, (display_height * depth_pitch) * 2); + rsxAddressToOffset(depth_buffer, &depth_offset); +} + +void waitflip() +{ + while (gcmGetFlipStatus() != 0) + usleep(200); + gcmResetFlipStatus(); +} + +void flip() +{ + if (!first_fb) + waitflip(); + else + gcmResetFlipStatus(); + + gcmSetFlip(context, curr_fb); + rsxFlushBuffer(context); + + gcmSetWaitFlip(context); + + curr_fb ^= 1; + set_render_target(curr_fb); + + first_fb = 0; +} diff --git a/tools/sacd_daemon/src/rsxutil.h b/tools/sacd_daemon/src/rsxutil.h new file mode 100644 index 00000000..9b287a74 --- /dev/null +++ b/tools/sacd_daemon/src/rsxutil.h @@ -0,0 +1,49 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __RSXUTIL_H__ +#define __RSXUTIL_H__ + +#include +#include + +#define CB_SIZE 0x100000 +#define HOST_SIZE (32 * 1024 * 1024) + +#ifdef __cplusplus +extern "C" { +#endif + +extern gcmContextData *context; +extern u32 display_width; +extern u32 display_height; +extern u32 curr_fb; + +void set_render_target(u32 index); +void init_screen(void *host_addr, u32 size); +void waitflip(); +void flip(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tools/sacd_daemon/src/server.c b/tools/sacd_daemon/src/server.c new file mode 100644 index 00000000..38f5cddd --- /dev/null +++ b/tools/sacd_daemon/src/server.c @@ -0,0 +1,263 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "server.h" +#include "exit_handler.h" + +int closesocket(int socket); + +static int client_connected = 0; + +int is_client_connected(void) +{ + return client_connected; +} + +static void client_thread(void *userdata) +{ + p_socket client = (p_socket) userdata; + ServerRequest request; + ServerResponse response; + uint8_t zero = 0; + pb_istream_t input = pb_istream_from_socket(client); + pb_ostream_t output = pb_ostream_from_socket(client); + sacd_reader_t *sacd_reader = 0; + scarletbook_handle_t *handle = 0; + int non_encrypted_disc = 0; + int checked_for_non_encrypted_disc = 0; + uint32_t encrypted_start_1 = 0; + uint32_t encrypted_start_2 = 0; + uint32_t encrypted_end_1 = 0; + uint32_t encrypted_end_2 = 0; + uint32_t block_size = 0; + uint32_t end_lsn = 0; + + client_connected = 1; + + response.data.bytes = (uint8_t *) malloc(MAX_PROCESSING_BLOCK_SIZE * SACD_LSN_SIZE); + + for (;;) + { + if (!pb_decode(&input, ServerRequest_fields, &request)) + { + break; + } + + response.has_data = false; + response.data.size = 0; + response.result = -1; + + switch(request.type) + { + case ServerRequest_Type_DISC_READ: + { + response.type = ServerResponse_Type_DISC_READ; + if (handle && sacd_reader) + { + int encrypted = 0; + end_lsn = request.sector_offset + request.sector_count; + + // check what block ranges are encrypted.. + if (request.sector_offset < encrypted_start_1) + { + block_size = min(encrypted_start_1 - request.sector_offset, MAX_PROCESSING_BLOCK_SIZE); + encrypted = 0; + } + else if (request.sector_offset >= encrypted_start_1 && request.sector_offset <= encrypted_end_1) + { + block_size = min(encrypted_end_1 + 1 - request.sector_offset, MAX_PROCESSING_BLOCK_SIZE); + encrypted = 1; + } + else if (request.sector_offset > encrypted_end_1 && request.sector_offset < encrypted_start_2) + { + block_size = min(encrypted_start_2 - request.sector_offset, MAX_PROCESSING_BLOCK_SIZE); + encrypted = 0; + } + else if (request.sector_offset >= encrypted_start_2 && request.sector_offset <= encrypted_end_2) + { + block_size = min(encrypted_end_2 + 1 - request.sector_offset, MAX_PROCESSING_BLOCK_SIZE); + encrypted = 1; + } + block_size = min(end_lsn - request.sector_offset, block_size); + + response.result = sacd_read_block_raw(sacd_reader, request.sector_offset, block_size, response.data.bytes); + response.has_data = response.result > 0; + response.data.size = response.result * SACD_LSN_SIZE; + + // the ATAPI call which returns the flag if the disc is encrypted or not is unknown at this point. + // user reports tell me that the only non-encrypted discs out there are DSD 3 14/16 discs. + // this is a quick hack/fix for these discs. + if (encrypted && checked_for_non_encrypted_disc == 0) + { + switch (handle->area[0].area_toc->frame_format) + { + case FRAME_FORMAT_DSD_3_IN_14: + case FRAME_FORMAT_DSD_3_IN_16: + non_encrypted_disc = *(uint64_t *)(response.data.bytes + 16) == 0; + break; + } + + checked_for_non_encrypted_disc = 1; + } + + // encrypted blocks need to be decrypted first + if (encrypted && non_encrypted_disc == 0) + { + sacd_decrypt(sacd_reader, response.data.bytes, block_size); + } + } + } + break; + case ServerRequest_Type_DISC_OPEN: + response.type = ServerResponse_Type_DISC_OPENED; + sacd_reader = sacd_open("/dev_bdvd"); + if (sacd_reader) + { + handle = scarletbook_open(sacd_reader, 0); + checked_for_non_encrypted_disc = 0; + non_encrypted_disc = 0; + + if (handle) + { + // set the encryption range + if (handle->area[0].area_toc != 0) + { + encrypted_start_1 = handle->area[0].area_toc->track_start; + encrypted_end_1 = handle->area[0].area_toc->track_end; + } + if (handle->area[1].area_toc != 0) + { + encrypted_start_2 = handle->area[1].area_toc->track_start; + encrypted_end_2 = handle->area[1].area_toc->track_end; + } + + response.result = sacd_authenticate(sacd_reader); + } + } + break; + case ServerRequest_Type_DISC_CLOSE: + { + response.type = ServerResponse_Type_DISC_CLOSED; + if (handle) + { + scarletbook_close(handle); + handle = 0; + } + if (sacd_reader) + { + sacd_close(sacd_reader); + sacd_reader = 0; + } + response.result = 0; + } + break; + case ServerRequest_Type_DISC_SIZE: + response.type = ServerResponse_Type_DISC_SIZE; + if (sacd_reader) + { + response.result = sacd_get_total_sectors(sacd_reader); + } + break; + } + + if (!pb_encode(&output, ServerResponse_fields, &response)) + { + break; + } + + /* We signal the end of a request with a 0 tag. */ + pb_write(&output, &zero, 1); + + if (request.type == ServerRequest_Type_DISC_CLOSE) + { + break; + } + } + + if (handle) + scarletbook_close(handle); + + if (sacd_reader) + sacd_close(sacd_reader); + + free(response.data.bytes); + + closesocket((int) *client); + client_connected = 0; + + sysThreadExit(0); +} + +void listener_thread(void *unused) +{ + sys_ppu_thread_t id; + struct sockaddr_in sa; + memset(&sa, 0, sizeof(sa)); + + sa.sin_family = AF_INET; + sa.sin_port = htons(2002); + sa.sin_addr.s_addr = htonl(INADDR_ANY); + + int list_s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + + // only 1 socket connection is allowed at once + if(bind(list_s, (struct sockaddr *)&sa, sizeof(sa)) == -1 || listen(list_s, 1) == -1) + { + sysThreadExit(0); + } + + int conn_s; + + while (!user_requested_exit()) + { + if((conn_s = accept(list_s, NULL, NULL)) > 0) + { + sysThreadCreate(&id, client_thread, (void *)&conn_s, 1337, 0x2000, 0, "client"); + sysThreadYield(); + } + } + + closesocket(list_s); + + sysThreadExit(0); +} diff --git a/tools/sacd_daemon/src/server.h b/tools/sacd_daemon/src/server.h new file mode 100644 index 00000000..e0091da2 --- /dev/null +++ b/tools/sacd_daemon/src/server.h @@ -0,0 +1,28 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __SERVER_H__ +#define __SERVER_H__ + +void listener_thread(void *unused); +int is_client_connected(void); + +#endif /* __SERVER_H__ */ diff --git a/tools/sacd_extract/CMakeLists.txt b/tools/sacd_extract/CMakeLists.txt new file mode 100644 index 00000000..02f041b5 --- /dev/null +++ b/tools/sacd_extract/CMakeLists.txt @@ -0,0 +1,83 @@ +# CMake build file for SACD Extract + +cmake_minimum_required(VERSION 2.6) +project(sacd_extract C) + +# Macros we'll need +include(CheckIncludeFile) +include(CheckFunctionExists) +include(CheckTypeSize) +include(FindThreads) + +# Include directory paths +include_directories(${CMAKE_CURRENT_BINARY_DIR}) +include_directories(${sacd_extract_SOURCE_DIR}) + +if (MSVC) + include_directories("./win32") +endif (MSVC) +if (APPLE) + include_directories("./osx") +endif (APPLE) +include_directories("../../libs/libcommon") +include_directories("../../libs/libdstdec") +include_directories("../../libs/libid3") +include_directories("../../libs/libsacd") + +# Extra flags for GCC +if (CMAKE_COMPILER_IS_GNUCC) + add_definitions( + -pipe + -Wall -Wextra -Wcast-align -Wpointer-arith + -Wno-unused-parameter -msse2) +endif (CMAKE_COMPILER_IS_GNUCC) + +if (MSVC) + SET (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd") + SET (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT /D PTW32_STATIC_LIB") + ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE) + ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) + ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_WARNINGS) + SET (CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ws2_32.lib pthreadVC2.lib iconv.lib") + SET (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ws2_32.lib pthreadVC2_static.lib iconv.lib /NODEFAULTLIB:LIBCMT.LIB") + + # disable warnings about libiconv link directory + cmake_policy(SET CMP0015 NEW) + + include_directories("../../libs/libiconv/include") + link_directories("../../libs/libiconv/lib/") +elseif(WIN32) + set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIRARIES} -lpthread -lws2_32 -liconv") +elseif(APPLE) + set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIRARIES} -lpthread -liconv") +else() + set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIRARIES} -lpthread") +endif() + +file(GLOB libcommon_headers ../../libs/libcommon/*.h) +file(GLOB libcommon_sources ../../libs/libcommon/*.c) +source_group(libcommon FILES ${libcommon_headers} ${libcommon_sources}) + +file(GLOB libdstdec_headers ../../libs/libdstdec/*.h) +file(GLOB libdstdec_sources ../../libs/libdstdec/*.c) +source_group(libdstdec FILES ${libdstdec_headers} ${libdstdec_sources}) + +file(GLOB libid3_headers ../../libs/libid3/*.h) +file(GLOB libid3_sources ../../libs/libid3/*.c) +source_group(libid3 FILES ${libid3_headers} ${libid3_sources}) + +file(GLOB libsacd_headers ../../libs/libsacd/*.h) +file(GLOB libsacd_sources ../../libs/libsacd/*.c) +source_group(libsacd FILES ${libsacd_headers} ${libsacd_sources}) + +file(GLOB main_headers ./*.h) +file(GLOB main_sources ./*.c) +source_group(main FILES ${main_headers} ${main_sources}) + +add_executable(sacd_extract + ${main_headers} ${main_sources} + ${libcommon_headers} ${libcommon_sources} + ${libdstdec_headers} ${libdstdec_sources} + ${libid3_headers} ${libid3_sources} + ${libsacd_headers} ${libsacd_sources} + ) diff --git a/tools/sacd_extract/getopt.c b/tools/sacd_extract/getopt.c new file mode 100644 index 00000000..34a8fedc --- /dev/null +++ b/tools/sacd_extract/getopt.c @@ -0,0 +1,1057 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + + Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98 + Free Software Foundation, Inc. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@gnu.org. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include +# include +#endif /* GNU C library. */ + +#ifdef VMS +# include +# if HAVE_STRING_H - 0 +# include +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. + When compiling libc, the _ macro is predefined. */ +# ifdef HAVE_LIBINTL_H +# include +# define _(msgid) gettext (msgid) +# else +# define _(msgid) (msgid) +# endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg = NULL; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized = 0; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +# include +# define my_index strchr +#else + +# if HAVE_STRING_H +# include +# else +# if HAVE_STRINGS_H +# include +# endif +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +extern char *getenv (); +#endif + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; + +static int original_argc; +static char *const *original_argv; + +/* Make sure the environment variable bash 2.0 puts in the environment + is valid for the getopt call we must make sure that the ARGV passed + to getopt is that one passed to the process. */ +static void +__attribute__ ((unused)) +store_args_and_env (int argc, char *const *argv) +{ + /* XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ + original_argc = argc; + original_argv = argv; +} +# ifdef text_set_element +text_set_element (__libc_subinit, store_args_and_env); +# endif /* text_set_element */ + +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#ifdef _LIBC + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#ifdef _LIBC + if (posixly_correct == NULL + && argc == original_argc && argv == original_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#ifdef _LIBC +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (opterr) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (opterr) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/tools/sacd_extract/getopt.h b/tools/sacd_extract/getopt.h new file mode 100644 index 00000000..7f7531d3 --- /dev/null +++ b/tools/sacd_extract/getopt.h @@ -0,0 +1,133 @@ +/* Declarations for getopt. + Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@gnu.org. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _GETOPT_H +#define _GETOPT_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +#if defined (__STDC__) && __STDC__ + const char *name; +#else + char *name; +#endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +#if defined (__STDC__) && __STDC__ +#ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int argc, char *const *argv, const char *shortopts); +#else /* not __GNU_LIBRARY__ */ +extern int getopt (); +#endif /* __GNU_LIBRARY__ */ +extern int getopt_long (int argc, char *const *argv, const char *shortopts, + const struct option *longopts, int *longind); +extern int getopt_long_only (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind, + int long_only); +#else /* not __STDC__ */ +extern int getopt (); +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* getopt.h */ diff --git a/tools/sacd_extract/getopt1.c b/tools/sacd_extract/getopt1.c new file mode 100644 index 00000000..a9cf4657 --- /dev/null +++ b/tools/sacd_extract/getopt1.c @@ -0,0 +1,190 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 + Free Software Foundation, Inc. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@gnu.org. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "getopt.h" + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +#include +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +#include + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/tools/sacd_extract/main.c b/tools/sacd_extract/main.c new file mode 100644 index 00000000..f2730972 --- /dev/null +++ b/tools/sacd_extract/main.c @@ -0,0 +1,368 @@ +/** + * SACD Ripper - http://code.google.com/p/sacd-ripper/ + * + * Copyright (c) 2010-2011 by respective authors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif + +#include + +#include +#include + +#include "getopt.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static struct opts_s +{ + int two_channel; + int multi_channel; + int output_dsf; + int output_dsdiff; + int output_iso; + int convert_dst; + int gapless; + int print; + char *input_device; /* Access method driver should use for control */ + char output_file[512]; +} opts; + +scarletbook_handle_t *handle; +scarletbook_output_t *output; + +/* Parse all options. */ +static int parse_options(int argc, char *argv[]) { + int opt; /* used for argument parsing */ + char *program_name = NULL; + + static const char help_text[] = + "Usage: %s [options] [outfile]\n" + " -2, --2ch-tracks : Export two channel tracks (default)\n" + " -m, --mch-tracks : Export multi-channel tracks\n" + " -p, --output-dsdiff : output as Philips DSDIFF file\n" + " -s, --output-dsf : output as Sony DSF file\n" + " -I, --output-iso : output as RAW ISO\n" + " -c, --convert-dst : convert DST to DSD\n" + " -g, --gapless : turn gapless mode on\n" + " -i, --input[=FILE] : set source and determine if \"iso\" image, \n" + " device or server (ex. -i192.168.1.10:2002)\n" + " -P, --print : display disc and track information\n" + "\n" + "Help options:\n" + " -?, --help : Show this help message\n" + " --usage : Display brief usage message\n"; + + static const char usage_text[] = + "Usage: %s [-2|--2ch-tracks] [-m|--mch-tracks] [-p|--output-dsdiff]\n" + " [-s|--output-dsf] [-I|--output-iso] [-c|--convert-dst]\n" + " [-g|--gapless] [-i|--input FILE] [-P|--print]\n" + " [-?|--help] [--usage]\n"; + + static const char options_string[] = "2mpsIcgi::P?"; + static const struct option options_table[] = { + {"2ch-tracks", no_argument, NULL, '2' }, + {"mch-tracks", no_argument, NULL, 'm' }, + {"output-dsdiff", no_argument, NULL, 'p'}, + {"output-dsf", no_argument, NULL, 's'}, + {"output-iso", no_argument, NULL, 'I'}, + {"convert-dst", no_argument, NULL, 'c'}, + {"gapless", no_argument, NULL, 'g'}, + {"input", required_argument, NULL, 'i' }, + {"print", no_argument, NULL, 'P' }, + + {"help", no_argument, NULL, '?' }, + {"usage", no_argument, NULL, 'u' }, + { NULL, 0, NULL, 0 } + }; + + program_name = strrchr(argv[0],'/'); + program_name = program_name ? strdup(program_name+1) : strdup(argv[0]); + + while ((opt = getopt_long(argc, argv, options_string, options_table, NULL)) >= 0) { + switch (opt) { + case '2': + opts.two_channel = 1; + break; + case 'm': + opts.multi_channel = 1; + break; + case 'p': + opts.output_dsdiff = 1; + opts.output_dsf = 0; + opts.output_iso = 0; + break; + case 's': + opts.output_dsdiff = 0; + opts.output_dsf = 1; + opts.output_iso = 0; + break; + case 'I': + opts.output_dsdiff = 0; + opts.output_dsf = 0; + opts.output_iso = 1; + break; + case 'c': opts.convert_dst = 1; break; + case 'g': opts.gapless = 1; break; + case 'i': opts.input_device = strdup(optarg); break; + case 'P': opts.print = 1; break; + + case '?': + fprintf(stdout, help_text, program_name); + free(program_name); + return 0; + break; + + case 'u': + fprintf(stderr, usage_text, program_name); + free(program_name); + return 0; + break; + } + } + + if (optind < argc) { + const char *remaining_arg = argv[optind++]; + strcpy(opts.output_file, remaining_arg); + } + + return 1; +} + +void handle_sigint(int sig_no) +{ + fwprintf(stdout, L"\rUser interrupted.. \n"); + scarletbook_output_interrupt(output); +} + +static void handle_status_update_track_callback(char *filename, int current_track, int total_tracks) +{ +#ifdef _WIN32 + wchar_t *wide_filename = (wchar_t *) charset_convert(filename, strlen(filename), "UTF-8", sizeof(wchar_t) == 2 ? "UCS-2-INTERNAL" : "UCS-4-INTERNAL"); +#else + wchar_t *wide_filename = (wchar_t *) charset_convert(filename, strlen(filename), "UTF-8", "WCHAR_T"); +#endif + fwprintf(stdout, L"\rProcessing [%ls] (%d/%d)..\n", wide_filename, current_track, total_tracks); + fflush(stdout); + free(wide_filename); +} + +static time_t started_processing; + +static void handle_status_update_progress_callback(uint32_t stats_total_sectors, uint32_t stats_total_sectors_processed, + uint32_t stats_current_file_total_sectors, uint32_t stats_current_file_sectors_processed) +{ + fwprintf(stdout, L"\rCompleted: %d%% (%.1fMB), Total: %d%% (%.1fMB) at %.2fMB/sec", (stats_current_file_sectors_processed*100/stats_current_file_total_sectors), + ((float)((double) stats_current_file_sectors_processed * SACD_LSN_SIZE / 1048576.00)), + (stats_total_sectors_processed * 100 / stats_total_sectors), + ((float)((double) stats_current_file_total_sectors * SACD_LSN_SIZE / 1048576.00)), + (float)((double) stats_total_sectors_processed * SACD_LSN_SIZE / 1048576.00) / (float)(time(0) - started_processing) + ); + fflush(stdout); +} + +/* Initialize global variables. */ +static void init(void) { + + /* Default option values. */ + opts.two_channel = 0; + opts.multi_channel = 0; + opts.output_dsf = 0; + opts.output_iso = 0; + opts.output_dsdiff = 0; + opts.convert_dst = 0; + opts.gapless = 0; + opts.print = 0; + opts.input_device = "/dev/cdrom"; + +#ifdef _WIN32 + signal(SIGINT, handle_sigint); +#else + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = &handle_sigint; + sigaction(SIGINT, &sa, NULL); +#endif + + init_logging(); +} + +int main(int argc, char* argv[]) +{ + char *albumdir, *musicfilename, *file_path; + int i, area_idx; + sacd_reader_t *sacd_reader; + +#ifdef PTW32_STATIC_LIB + pthread_win32_process_attach_np(); + pthread_win32_thread_attach_np(); +#endif + + init(); + if (parse_options(argc, argv)) + { + setlocale(LC_ALL, ""); + if (fwide(stdout, 1) < 0) + { + fprintf(stderr, "ERROR: Output not set to wide.\n"); + } + + // default to 2 channel + if (opts.two_channel == 0 && opts.multi_channel == 0) + { + opts.two_channel = 1; + } + + sacd_reader = sacd_open(opts.input_device); + if (sacd_reader) + { + + handle = scarletbook_open(sacd_reader, 0); + if (handle) + { + if (opts.print) + { + scarletbook_print(handle); + } + + if (opts.output_dsf || opts.output_iso || opts.output_dsdiff) + { + output = scarletbook_output_create(handle, handle_status_update_track_callback, handle_status_update_progress_callback); + + // select the channel area + area_idx = ((has_multi_channel(handle) && opts.multi_channel) || !has_two_channel(handle)) ? handle->mulch_area_idx : handle->twoch_area_idx; + + albumdir = get_album_dir(handle); + + if (opts.output_iso) + { + #define FAT32_SECTOR_LIMIT 2090000 + uint32_t total_sectors = sacd_get_total_sectors(sacd_reader); +#ifdef SECTOR_LIMIT + uint32_t sector_size = FAT32_SECTOR_LIMIT; + uint32_t sector_offset = 0; + if (total_sectors > FAT32_SECTOR_LIMIT) + { + musicfilename = (char *) malloc(512); + file_path = make_filename(0, 0, albumdir, "iso"); + for (i = 1; total_sectors != 0; i++) + { + sector_size = min(total_sectors, FAT32_SECTOR_LIMIT); + snprintf(musicfilename, 512, "%s.%03d", file_path, i); + scarletbook_output_enqueue_raw_sectors(output, sector_offset, sector_size, musicfilename, "iso"); + sector_offset += sector_size; + total_sectors -= sector_size; + } + free(file_path); + free(musicfilename); + } + else +#endif + { + get_unique_filename(&albumdir, "iso"); + file_path = make_filename(0, 0, albumdir, "iso"); + scarletbook_output_enqueue_raw_sectors(output, 0, total_sectors, file_path, "iso"); + free(file_path); + } + } + else + { + // create the output folder + get_unique_dir(0, &albumdir); + recursive_mkdir(albumdir, 0666); + + // fill the queue with items to rip + for (i = 0; i < handle->area[area_idx].area_toc->track_count; i++) + { + musicfilename = get_music_filename(handle, area_idx, i); + if (opts.output_dsf) + { + file_path = make_filename(0, albumdir, musicfilename, "dsf"); + scarletbook_output_enqueue_track(output, area_idx, i, file_path, "dsf", + 1, /* always decode to DSD */ + opts.gapless); + } + else if (opts.output_dsdiff) + { + file_path = make_filename(0, albumdir, musicfilename, "dff"); + scarletbook_output_enqueue_track(output, area_idx, i, file_path, "dsdiff", + (opts.convert_dst ? 1 : handle->area[area_idx].area_toc->frame_format != FRAME_FORMAT_DST), + opts.gapless); + } + + free(musicfilename); + free(file_path); + } + } + + started_processing = time(0); + scarletbook_output_start(output); + scarletbook_output_destroy(output); + + fprintf(stdout, "\rWe are done.. \n"); + } + scarletbook_close(handle); + + free(albumdir); + } + } + + sacd_close(sacd_reader); + +#ifndef _WIN32 + freopen(0, "w", stdout); +#endif + if (fwide(stdout, -1) >= 0) + { + fprintf(stderr, "ERROR: Output not set to byte oriented.\n"); + } + } + + destroy_logging(); + +#ifdef PTW32_STATIC_LIB + pthread_win32_process_detach_np(); + pthread_win32_thread_detach_np(); +#endif + + return 0; +} diff --git a/tools/sacd_extract/osx/malloc.h b/tools/sacd_extract/osx/malloc.h new file mode 100644 index 00000000..e69de29b diff --git a/tools/sacd_extract/sacd_extract.sln b/tools/sacd_extract/sacd_extract.sln new file mode 100644 index 00000000..ce3c9409 --- /dev/null +++ b/tools/sacd_extract/sacd_extract.sln @@ -0,0 +1,29 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sacd_extract", "sacd_extract.vcproj", "{0BDC531E-E930-4B53-BC83-FC38C2AAD4DB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0BDC531E-E930-4B53-BC83-FC38C2AAD4DB}.Debug|Win32.ActiveCfg = Debug|Win32 + {0BDC531E-E930-4B53-BC83-FC38C2AAD4DB}.Debug|Win32.Build.0 = Debug|Win32 + {0BDC531E-E930-4B53-BC83-FC38C2AAD4DB}.Debug|x64.ActiveCfg = Debug|Win32 + {0BDC531E-E930-4B53-BC83-FC38C2AAD4DB}.Release|Win32.ActiveCfg = Release|Win32 + {0BDC531E-E930-4B53-BC83-FC38C2AAD4DB}.Release|Win32.Build.0 = Release|Win32 + {0BDC531E-E930-4B53-BC83-FC38C2AAD4DB}.Release|x64.ActiveCfg = Release|Win32 + {0BDC531E-E930-4B53-BC83-FC38C2AAD4DB}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {0BDC531E-E930-4B53-BC83-FC38C2AAD4DB}.ReleaseWithoutAsm|Win32.Build.0 = Release|Win32 + {0BDC531E-E930-4B53-BC83-FC38C2AAD4DB}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/tools/sacd_extract/sacd_extract.vcproj b/tools/sacd_extract/sacd_extract.vcproj new file mode 100644 index 00000000..b2d28eae --- /dev/null +++ b/tools/sacd_extract/sacd_extract.vcproj @@ -0,0 +1,443 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/sacd_extract/win32/inttypes.h b/tools/sacd_extract/win32/inttypes.h new file mode 100644 index 00000000..4b3828a2 --- /dev/null +++ b/tools/sacd_extract/win32/inttypes.h @@ -0,0 +1,305 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +# define SCNdPTR "I64d" +# define SCNiPTR "I64i" +#else // _WIN64 ][ +# define SCNdPTR "ld" +# define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +# define SCNoPTR "I64o" +# define SCNuPTR "I64u" +# define SCNxPTR "I64x" +# define SCNXPTR "I64X" +#else // _WIN64 ][ +# define SCNoPTR "lo" +# define SCNuPTR "lu" +# define SCNxPTR "lx" +# define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + + +#endif // _MSC_INTTYPES_H_ ] diff --git a/tools/sacd_extract/win32/stdbool.h b/tools/sacd_extract/win32/stdbool.h new file mode 100644 index 00000000..037d05ed --- /dev/null +++ b/tools/sacd_extract/win32/stdbool.h @@ -0,0 +1,25 @@ +#ifndef STDBOOL_WIN32_H +#define STDBOOL_WIN32_H + +#ifndef _WIN32 +#error "This stdbool.h file should only be compiled under Windows" +#endif + +#ifndef __cplusplus + +typedef unsigned char bool; + +#define true 1 +#define false 0 + +#ifndef CASSERT +#define CASSERT(exp, name) typedef int dummy##name [(exp) ? 1 : -1]; +#endif + +CASSERT(sizeof(bool) == 1, bool_is_one_byte) +CASSERT(true, true_is_true) +CASSERT(!false, false_is_false) + +#endif + +#endif \ No newline at end of file diff --git a/tools/sacd_extract/win32/stdint.h b/tools/sacd_extract/win32/stdint.h new file mode 100644 index 00000000..d0daff31 --- /dev/null +++ b/tools/sacd_extract/win32/stdint.h @@ -0,0 +1,247 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2008 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we should wrap include with 'extern "C++" {}' +// or compiler give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#ifdef __cplusplus +extern "C" { +#endif +# include +#ifdef __cplusplus +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef char int8_t; + typedef short int16_t; + typedef int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +#define INTMAX_C INT64_C +#define UINTMAX_C UINT64_C + +#endif // __STDC_CONSTANT_MACROS ] + + +#endif // _MSC_STDINT_H_ ] diff --git a/tools/sacd_extract/win32/sys/atomic.h b/tools/sacd_extract/win32/sys/atomic.h new file mode 100644 index 00000000..8ef9a0e4 --- /dev/null +++ b/tools/sacd_extract/win32/sys/atomic.h @@ -0,0 +1,58 @@ +#ifndef _ATOMIC_MSVC_H +#define _ATOMIC_MSVC_H + +#include +#include + +typedef intptr_t atomic_t; + +/*! + * The Microsoft C/C++ compiler has acquire semantics for reads + * and release semantics for writes that operate on volatiles. + * See this for further explanation: + * http://msdn.microsoft.com/en-us/library/ms686355(VS.85).aspx + */ + +__inline atomic_t sysAtomicRead(volatile atomic_t* ptr) { + atomic_t value = *ptr; + return(value); +} + +__inline void sysAtomicSet(volatile atomic_t* ptr , atomic_t val) { + *ptr = val; +} + +/*! + * @brief Atomically compares and exchanges two values. The function will + * compare the value stored in ptr with oldval and if they are equal + * it will store newval into ptr. + * @return The value stored in ptr. + */ +__inline atomic_t sysAtomicCompareAndExchange(volatile atomic_t* ptr, + atomic_t oldval, + atomic_t newval) { + return (atomic_t) InterlockedCompareExchange((LONG volatile*) ptr, + (LONG) newval, + (LONG) oldval); +} + +/*! + * @brief Atomically swap two values. This function will store newval into ptr. + * @return Old value of ptr. + */ +__inline atomic_t sysAtomicSwap(volatile atomic_t* ptr, atomic_t newval) { + return (atomic_t) InterlockedExchange((LONG volatile*) ptr, (LONG) newval); +} + +/*! + * @brief Atomically increment a value. The function will increment the value + * stored in ptr with newval. Newval can be a negative value. + * @return The new value stored in ptr. + */ +__inline atomic_t sysAtomicInc(volatile atomic_t* ptr, + atomic_t newval) { + return (atomic_t) InterlockedExchangeAdd((LONG volatile*) ptr, + (LONG) newval); +} + +#endif \ No newline at end of file diff --git a/tools/sacd_extract/win32/unistd.h b/tools/sacd_extract/win32/unistd.h new file mode 100644 index 00000000..5bc4e47b --- /dev/null +++ b/tools/sacd_extract/win32/unistd.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2000-2001 the xine project + * + * This file is part of xine, a unix video player. + * + * xine is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * xine is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * WIN32 PORT, + * by Matthew Grooms + * + * unistd.h - This is mostly a catch all header that maps standard unix + * libc calls to the equivelent win32 functions. + * + */ + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include +#include +#include +#include + +#ifndef _SYS_UNISTD_H_ +#define _SYS_UNISTD_H_ + +#ifndef inline +#define inline __inline +#endif + +#ifndef ssize_t +#define ssize_t __int64 +#endif + +#define mkdir( A, B ) _mkdir( A ) +#define lstat stat + +#ifndef S_ISDIR +#define S_ISDIR(A) ( S_IFDIR & A ) +#endif +#ifndef S_ISREG +#define S_ISREG(m) ((m) & _S_IFREG) +#endif +#ifndef S_ISBLK +#define S_ISBLK(m) 0 +#endif +#ifndef S_ISCHR +#define S_ISCHR(m) 0 +#endif + +#define S_IXUSR S_IEXEC +#define S_IXGRP S_IEXEC +#define S_IXOTH S_IEXEC + +#define M_PI 3.14159265358979323846 /* pi */ + +#define bzero( A, B ) memset( A, 0, B ) + +#ifndef strcasecmp +#define strcasecmp _stricmp +#endif + +#ifndef strncasecmp +#define strncasecmp _strnicmp +#endif + +#define snprintf _snprintf +#define vsnprintf _vsnprintf + +// FIXME : I dont remember why this is here +#define readlink + +#endif