Compare commits
5 Commits
winampgit-
...
65142dd941
Author | SHA1 | Date | |
---|---|---|---|
|
65142dd941 | ||
|
5b91e3f697 | ||
|
ef6217161e | ||
|
9c7f91496c | ||
|
ffeccedefa |
215
LICENSE.md
@@ -1,79 +1,180 @@
|
||||
# Winamp Collaborative License (WCL) Version 1.0.1
|
||||
|
||||
This License governs the use, modification, and distribution of the Winamp software.
|
||||
By using, Modifying, or distributing this software, you agree to the following terms:
|
||||
GNU通用公共许可协议
|
||||
第三版,2007年6月29日
|
||||
版权所有 © 2007 自由软件基金会 <http://fsf.org/>
|
||||
任何人皆可复制和发布本协议的完整副本,但不得修改
|
||||
【译者声明】
|
||||
|
||||
## Preamble
|
||||
The Winamp Collaborative License is a free, copyleft license for software and other kinds of works. It is designed to ensure that you have the freedom to use, Modify, and study the software, but with certain restrictions on the distribution of modifications to maintain the integrity and collaboration of the project.
|
||||
This is an unofficial translation of the GNU General Public License into Chinese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU GPL--only the original English text of the GNU GPL does that. However, we hope that this translation will help Chinese speakers understand the GNU GPL better.
|
||||
这是GNU通用公共许可协议的一份非官方中文翻译,并非自由软件基金会所发表,不适用于使用GNU通用公共许可协议发布的软件的法律声明--只有GNU通用公共许可协议英文原版才具有法律效力。不过我们希望本翻译能够帮助中文读者更好地理解GNU通用公共许可协议。
|
||||
|
||||
## TERMS AND CONDITIONS
|
||||
You may publish this translation, modified or unmodified, only under the terms at https://www.gnu.org/licenses/translations.html.
|
||||
【引言】
|
||||
|
||||
### 1. Definitions
|
||||
- "This License" refers to version 1.0.1 of the Winamp Collaborative License.
|
||||
- "The Program" refers to any copyrightable work Licensed under this License.
|
||||
- "You" refers to each Licensee, whether an individual or organization.
|
||||
- "Modify" means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy.
|
||||
- "Covered Work" means either the unmodified Program or a work based on the Program.
|
||||
- "Convey" means any kind of propagation that enables other parties to make or receive copies.
|
||||
GNU通用公共许可协议是一份面向软件及其他类型作品的,自由的版权共产协议。
|
||||
就多数软件而言,许可协议被设计用于剥夺你分享和修改软件的自由。相反,GNU通用公共许可协议力图保障你分享和修改某程序全部版本的权利--确保自由软件对其用户来说是自由的。我们自由软件基金会将GNU通用公共许可协议用于我们的大多数软件,并为一些其他作品的作者效仿。你也可以将本协议用于你的程序。
|
||||
所谓自由软件,强调自由,而非免费。本GNU通用公共许可协议设计用于确保你享有分发自由软件的自由(你可以为此服务收费),确保你可以在需要的时候获得这些软件的源码,确保你可以修改这些软件或者在新的自由软件中复用其中某些片段,并且确保你在这方面享有知情权。
|
||||
为保障你的权益,我们需要作一些限定:禁止任何人否认你的上述权利,或者要求你放弃它们。因此,当你分发或修改这些软件时,你有一定的责任--尊重他人的自由。如果你分发这种程序的副本,无论收费还是免费,你必须给予与你同等的权利。你还要确保他们也能收到源码并了解他们的权利。
|
||||
采用GNU通用公共许可协议的开发者通过两步保障你的权益:其一,申明软件的版权;其二,通过本协议使你可以合法地复制、分发和修改该软件。
|
||||
为了保护每一位作者和开发者,GNU通用公共许可协议指明一点:自由软件并没有品质担保。为用户和作者双方着想,GNU通用公共许可协议要求修改版必须有标记,以免其问题被错误地归到先前版本的作者身上。
|
||||
某些设备设计成拒绝用户安装运行修改过的软件,但厂商不受限。这和我们保护用户享有修改软件的自由的宗旨存在根本性矛盾。该滥用协议的模式出现于个人用品领域,这恰是最不可接受的。因此,我们设计了这版GNU通用公共许可协议来禁止这类产品。如果此类问题在其他领域涌现,我们时刻准备着在将来的版本中把规定扩展到相应领域,以保护用户的自由。
|
||||
最后,每个程序都持续受到软件专利的威胁。政府不应该允许专利限制通用计算机软件的开发和应用,在做不到这点时,我们希望避免专利应用有效地使自由软件私有化的危险。就此,GNU通用公共许可协议保证专利不能使程序非自由化。
|
||||
|
||||
### 2. Basic Permissions
|
||||
All rights granted under this License are granted for the term of copyright on the Program and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a Covered work is covered by this License only if its contents constitute a Covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
|
||||
下文是关于复制、分发和修改的严谨描述和实施条件。
|
||||
【关于复制、分发和修改的术语和条件】
|
||||
|
||||
### 3. Grant of License
|
||||
You are granted the right to view, access, and study the source code of the software.
|
||||
You are granted the right to Modify the software for private use only. You may make, run, and propagate Covered works that you do not Convey, without conditions, so long as your License otherwise remains in force.
|
||||
〇、定义
|
||||
|
||||
### 4. Contributions
|
||||
- Contribution to Project: You are encouraged to contribute improvements, enhancements, and bug fixes back to the project. Contributions must be submitted to the official repository and will be reviewed and incorporated at the discretion of the maintainers.
|
||||
- Assignment of Rights: By submitting contributions, you agree that all intellectual property rights, including copyright, in your contributions are assigned to Winamp. You hereby grant Winamp a perpetual, worldwide, non-exclusive, royalty-free license to use, copy, modify, and distribute your contributions as part of the software, without any compensation to you.
|
||||
- Waiver of Rights: You waive any rights to claim authorship of the contributions or to object to any distortion, mutilation, or other modifications of the contributions.
|
||||
"本协议"指GNU通用公共许可协议第三版。
|
||||
"版权"也指适用于诸如半导体掩模的其他类型作品的类似法律。
|
||||
"本程序"指任何在本协议保护下的有版权的作品。每个许可获得者称作"你"。"许可获得者"和"接收者"可以是个人或组织。
|
||||
"修改"一个作品指需要版权许可的复制及对作品全面的或部分的改编行为,有别于制作副本。所产生的作品称作前作的"修改版",或"基于"前作的作品。
|
||||
"受保护作品"指程序或其派生作品。
|
||||
"传播"作品指那些未经许可就会在适用版权法律下构成直接或间接侵权的行为,不包括在计算机上运行和私下的修改。传播包括复制、分发(无论修改与否)、向公众公开,以及在某些国家的其他行为。
|
||||
"转发"作品指让他方能够制作或者接收副本的行为。仅仅通过计算机网络和用户交互,没有传输副本,则不算转发。
|
||||
一个显示"适当的法律声明"的交互式用户界面应包括一个便捷而醒目的可视化特性:(1)显示适当的版权声明;(2)告知用户没有品质担保(提供了品质担保的情况除外),许可获得者可以在本协议约束下转发该作品,及查看本协议副本的途径。如果该界面提供一个命令列表,如菜单,其表项应符合上述规范。
|
||||
|
||||
### 5. Restrictions
|
||||
- No Distribution of Modified Versions: You may not distribute modified versions of the software, whether in source or binary form.
|
||||
- Official Distribution: Only the maintainers of the official repository are allowed to distribute the software and its modifications.
|
||||
一、源码
|
||||
|
||||
### 6. No Sublicensing
|
||||
Sublicensing is not allowed; section 5 makes it unnecessary.
|
||||
作品的源码指其可修改的首选形式,目标码指所有其他形式。
|
||||
"标准接口"指标准化组织定义的官方标准中的接口,或针为某种编程语言设定的接口中为开发者广泛使用的接口。
|
||||
可执行作品中的"系统库"不是指整个程序,而是涵盖此等内容:(a)以通常形式和主部件打包到一起却并非后者一部分,且(b)仅为和主部件一起使作品可用或实现某些已有公开实现源码的接口。"主部件"在这里指可执行作品运行依赖的操作系统(如果存在)的必要部件(内核、窗口系统等),生成该作品的编译器,或运行所需的目标码解释器。
|
||||
目标码形式的作品中"相应的源码"指所有修改作品及生成、安装、运行(对可执行作品而言)目标码所需的源码,包括控制上述行为的脚本。可是,其中不包括系统库、通用工具、未修改直接用于支持上述行为却不是该作品一部分的通常可得的自由软件。例如,相应的源码包含配合作品源文件的接口定义,以及共享库和作品专门依赖的动态链接子程序的源码。这里的依赖体现为频密的数据交换或者该子程序和作品其他部分的控制流切换。
|
||||
相应的源码不必包含那些用户可以通过源码其他部分自动生成的内容。
|
||||
源码形式作品的相应源码即其本身。
|
||||
|
||||
### 7. Protecting Users' Legal Rights From Anti-Circumvention Law
|
||||
二、基本许可
|
||||
|
||||
No Covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
|
||||
本协议的一切授权都是对本程序的版权而言的,并且在所述条件都满足时不可撤销。本协议明确批准你不受限制地运行本程序的未修改版本。受保护作品的运行输出,仅当其内容构成一个受保护作品时,才会为本协议所约束。如版权法所赋予,本协议承认你正当使用或与之等价的权利。
|
||||
只要你获得的许可仍有效,你可以制作、运行和传播那些你并不转发的受保护作品。只要你遵守本协议中关于转发你不占有版权的材料的条款,你可以向他人转发,仅仅以求对方为你做定制或向你提供运行这些作品的工具。那些为你制作或运行这些受保护作品的人,应该在你的指引和控制下,谨代表你工作,即禁止他们在双方关系之外制作任何你提供的受版权保护材料的副本。
|
||||
仅当满足后文所述条件时,其他各种情况下的转发才是允许的。不允许再授权行为,而第十条的存在使再授权变得没有必要。
|
||||
|
||||
### 8. Disclaimer of Warranty
|
||||
The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.
|
||||
三、保护用户的合法权益免受反破解法限制
|
||||
|
||||
### 9. Limitation of Liability
|
||||
In no event will the authors or copyright holders be liable for any special, incidental, indirect, or consequential damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or any other pecuniary loss) arising out of the use of or inability to use the software, even if the authors or copyright holders have been advised of the possibility of such damages.
|
||||
在任何满足1996年12月20日通过的WIPO版权条约第11章要求的法律,或类似的禁止或限制技术手段破解的法律下,受保护作品不应该视为有效技术手段的一部分。
|
||||
当你转发一个受保护作品时,你将失去任何通过法律途径限制技术手段破解的权力,乃至于通过行使本协议所予权利实现的破解。你即已表明无心通过限制用户操作或修改受保护作品来确保你或第三方关于禁止技术手段破解的法定权利。
|
||||
|
||||
### 10. Termination
|
||||
This License and the rights granted hereunder will terminate automatically if you fail to comply with the terms and conditions herein. Upon termination, you must cease all use of the software and destroy all copies, full or partial, of the software.
|
||||
四、转发完整副本
|
||||
|
||||
### 11. Protection of Copyright
|
||||
The original authors or copyright holders of the software retain all rights, title, and interest in the software. This license does not transfer any ownership rights.
|
||||
You must retain all copyright, patent, trademark, and attribution notices in the source code and documentation of the software.
|
||||
By submitting contributions, you agree that the contributions are your original work and you grant the project a perpetual, worldwide, non-exclusive, royalty-free license to use, copy, modify, and distribute your contributions as part of the software.
|
||||
Any unauthorized use, reproduction, or distribution of the software, or any portion thereof, may result in civil and criminal penalties.
|
||||
你可以通过任何媒介发布你接收到的本程序的完整源码副本,但要做到:为每一个副本醒目而恰当地发布版权;完整地保留关于本协议及按第七条加入的非许可性条款;完整地保留免责声明;给接收者附上一份本协议的副本。
|
||||
你可以免费或收费转发,也可以选择提供技术支持或品质担保以换取收入。
|
||||
|
||||
### 12. Patent Rights
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims to make, use, sell, offer for sale, import, and otherwise run, modify and propagate the contents of its contributor version.
|
||||
If you initiate litigation (including a cross-claim or counterclaim) against any party alleging that the Program or a contribution incorporated within the Program constitutes direct or contributory patent infringement, then any patent licenses granted to you under this License for that Program shall terminate as of the date such litigation is filed.
|
||||
五、转发修改过的源码版本
|
||||
|
||||
### 13. Trademark Usage
|
||||
This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for describing the origin of the Program and reproducing the content of the copyright notice.
|
||||
你可以以源码形式转发基于本程序的作品或修改的内容,除满足第四条外还需要满足以下几点要求:
|
||||
a)该作品必须带有醒目的修改声明及相应的日期。
|
||||
b)该作品必须带有醒目的声明,指出其在本协议及任何符合第七条的附加条件下发布。这个要求修正了第四条关于"完整保留"的内容。
|
||||
c)你必须按照本协议将该作品整体向想要获得许可的人授权,本协议及符合第七条的附加条款就此适用于整个作品,即其每一部分,不管如何建包。本协议不允许以其他形式授权该作品,但如果你收到别的许可则另当别论。
|
||||
d)如果该作品有交互式用户界面,则其必须显示适当的法律声明。然而,当本程序有交互式用户界面却不显示适当的法律声明时,你的作品也不必。
|
||||
一个在存储或分发媒介上的受保护作品和其他分离的单体作品的联合作品,在既不是该受保护作品的自然扩展,也不以构筑更大的程序为目的,并且自身及其产生的版权并非用于限制单体作品给予联合作品用户的访问及其他合法权利时,称为"聚合体"。在聚合作品中包含受保护作品并不会使本协议影响聚合作品的其他部分。
|
||||
|
||||
### 14. Privacy and Data Protection
|
||||
You must comply with all applicable privacy and data protection laws in connection with your use of the Program.
|
||||
If the Program collects user data, you must provide clear notice and obtain any necessary consents for such collection.
|
||||
六、以非源码形式转发
|
||||
|
||||
### 15. Support and Updates
|
||||
The Licensor has no obligation to provide support, updates, or maintenance for the Program. Any such support, updates, or maintenance will be provided at the sole discretion of the Licensor.
|
||||
你可以如第四条和第五条所述那样以目标码形式转发受保护作品,同时在本协议规范下以如下方式之一转发机器可读的对应源码:
|
||||
a)目标码通过实体产品(涵盖某种实体分发媒介)转发时,通过常用于软件交换的耐用型实体媒介随同转发相应的源码。
|
||||
b)目标码通过实体产品(涵盖某种实体分发媒介)转发时,伴以具有至少三年且与售后服务等长有效期的书面承诺,给予目标码的持有者:(1)包含产品全部软件的相应源码的常用于软件交换的耐用型实体媒介,且收费不超过其合理的转发成本;或者(2)通过网络免费获得相应源码的途径。
|
||||
c)单独转发目标码时,伴以提供源码的书面承诺。本选项仅在你收到目标码及b项形式的承诺的情况下可选。
|
||||
d)通过在指定地点提供目标码获取服务(无论是否收费)的形式转发目标码时,在同一地点以同样的方式提供对等的源码获取服务,并不得额外收费。你不以要求接收者在复制目标码的同时复制源码。如果提供目标码复制的地点为网络服务器,相应的源码可以提供在另一个支持相同复制功能的服务器上(由你或者第三方运营),不过你要在目标码处指出相应源码的确切路径。不管你用什么源码服务器,你有义务要确保持续可用以满足这些要求。
|
||||
e)通过点对点传输转发目标码时,告知其他节点目标码和源码在何处以d项形式向大众免费提供。
|
||||
"面向用户的产品"指(1)"消费品",即个人、家庭或日常用途的个人有形财产;或者(2)面向社会团体设计或销售,却落入居家之物。在判断一款产品是否消费品时,争议案例的判断将向利于扩大保护靠拢。就特定用户接收到特定产品而言,"正常使用"指对此类产品的典型或一般使用,不管该用户的身份,该用户对该产品的实际用法,以及该产品的预期用法。无论产品是否实质上具有商业上的,工业上的,及非面向消费者的用法,它都视为消费品,除非以上用法代表了它唯一的重要使用模式。
|
||||
"安装信息"对面向用户的产品而言,指基于修改过的源码安装运行该产品中的受保护作品的修改版所需的方法、流程、认证码及其他信息。这些信息必须足以保证修改过的目标码不会仅仅因为被修改过而不能继续工作。
|
||||
如果你根据本条在,或随,或针对一款面向用户的产品,以目标码形式转发某作品,且转发体现于该产品的所有权和使用权永久或者在一定时期内转让予接收者的过程(无论其有何特点),根据本条进行的源码转发必须伴有安装信息。不过,如果你和第三方都没有保留在该产品上安装修改后的目标码的能力(如作品安装在ROM上),这项要求不成立。 要求提供安装信息并不要求为修改或安装的作品,以及其载体产品继续提供技术支持、品质担保和升级。当修改本身对网络运行有实质上的负面影响,或违背了网络通信协议和规则时,可以拒绝其联网。
|
||||
根据本条发布的源码及安装信息,必须以公共的文件格式(并且存在可用的空开源码的处理工具)存在,同时不得对解压、阅读和复制设置任何密码。
|
||||
|
||||
### 16. Compliance
|
||||
You must comply with all applicable laws and regulations in connection with your use of the Program.
|
||||
七、附加条款
|
||||
|
||||
### 17. Miscellaneous
|
||||
- Governing Law and Jurisdiction: This License shall be governed by and construed in accordance with the laws of Belgium. Any disputes arising out of or in connection with this License shall be subject to the exclusive jurisdiction of the courts located in Brussels, Belgium.
|
||||
- Severability: If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
|
||||
By using, Modifying, or contributing to the software, you acknowledge that you have read, understood, and agree to be bound by these terms and conditions.
|
||||
"附加许可"用于补充本协议,以允许一些例外情况。合乎适用法律的对整个程序适用的附加许可,应该被视为本协议的内容。如果附加许可作用于程序的某部分,则该部分受此附加许可约束,而其他部分不受其影响。
|
||||
当你转发本程序时,你可以选择性删除副本或其部分的附加条款。(附加条款可以写明在某些情况下要求你修改时删除该条款。)在你拥有或可授予恰当版权许可的受保护作品中,你可以在你添加的材料上附加许可。
|
||||
尽管已存在本协议的其他条款,对你添加到受保护作品的材料,你可以(如果你获得该材料版权持有人的授权)以如下条款补充本协议:
|
||||
a)表示不提供品质担保或有超出十五、十六条的责任。
|
||||
b)要求在此材料中或在适当的法律声明中保留特定的合理法律声明或创作印记。
|
||||
c)禁止误传材料的起源,或要求合理标示修改以别于原版。
|
||||
d)限制以宣传为目的使用该材料的作者或授权人的名号。
|
||||
e)降低约束以便赋予在商标法下使用商品名、商品标识及服务标识。
|
||||
f)要求任何转发该材料(或其修改版)并对接收者提供契约性责任许诺的人,保证这种许诺不会给作者或授权人带来连带责任。
|
||||
此外的非许可性附加条款都被视作第十条所说的"进一步的限制"。如果你接收到的程序或其部分,声称受本协议约束,却补充了这种进一步的限制条款,你可以去掉它们。如果某许可协议包含进一步的限制条款,但允许通过本协议再授权或转发,你可以通过本协议再授权或转发加入了受前协议管理的材料,不过要同时移除上述条款。
|
||||
如果你根据本条向受保护作品添加了调控,你必须在相关的源文件中加入对应的声明,或者指出哪里可以找到它们。
|
||||
附加条款,不管是许可性的还是非许可性的,可以以独立的书面协议出现,也可以声明为例外情况,两种做法都可以实现上述要求。
|
||||
|
||||
This custom License aims to maintain the collaborative nature of the project while restricting the distribution of modified versions.
|
||||
八、终止授权
|
||||
|
||||
除非在本协议明确授权下,你不得传播或修改受保护作品。其他任何传播或修改受保护作品的企图都是无效的,并将自动中止你通过本协议获得的权利(包括第十一条第3段中提到的专利授权)。
|
||||
然而,当你不再违反本协议时,你从特定版权持有人处获得的授权恢复:(1)暂时恢复,直到版权持有人明确终止;(2)永久恢复,如果版权持有人没能在60天内以合理的方式指出你的侵权行为。
|
||||
再者,如果你第一次收到了特定版权持有人关于你违反本协议(对任意作品)的通告,且在收到通告后30天内改正,那你可以继续享此有授权。
|
||||
当你享有的权利如本条所述被中止时,已经从你那根据本协议获得授权的他方的权利不会因此中止。在你的权利恢复之前,你没有资格凭第十条获得同一材料的授权。
|
||||
|
||||
九、持有副本无需接受协议
|
||||
|
||||
你不必为接收或运行本程序而接受本协议。类似的,仅仅因点对点传输接收到副本引发的对受保护作品的辅助性传播,并不要求接受本协议。但是,除本协议外没有什么可以授权你传播或修改任何受保护作品。如果你不接受本协议,这些行为就侵犯了版权。因此,一旦修改和传播一个受保护作品,就表明你接受本协议。
|
||||
|
||||
十、对下游接收者的自动授权
|
||||
|
||||
每当你转发一个受保护作品,其接收者自动获得来自初始授权人的授权,依照本协议可以运行、修改和传播此作。你没有要求第三方遵守该协议的义务。
|
||||
"实体事务"指转移一个组织的控制权或全部资产、或拆分或合并组织的事务。如果实体事务导致一个受保护作品的传播,则事务中各收到作品副本方,都有获得前利益相关者享有或可以如前段所述提供的对该作品的任何授权,以及从前利益相关者处获得并拥有相应的源码的权利,如果前利益相关者享有或可以通过合理的努力获得此源码。
|
||||
你不可以对本协议所授权利的行使施以进一步的限制。例如,你不可以索要授权费或版税,或就行使本协议所授权利征收其他费用;你也不能发起诉讼(包括交互诉讼和反诉),宣称制作、使用、零售、批发、引进本程序或其部分的行为侵犯了任何专利。
|
||||
|
||||
十一、专利
|
||||
|
||||
"贡献人"指通过本协议对本程序或其派生作品进行使用认证的版权持有人。授权作品成为贡献人的"贡献者版"。
|
||||
贡献人的"实质专利权限"指其拥有或掌控的,无论是已获得的还是将获得的全部专利权限中,可能被通过某种本协议允许的方式制作、使用或销售其贡献者版作品的行为侵犯的部分,不包括仅有修改其贡献者版作品才构成侵犯的部分。"掌控"所指包括享有和本协议相一致的专利再授权的权利。
|
||||
每位贡献人皆其就实质专利权限,授予你一份全球有效的免版税的非独占专利许可,以制作、使用、零售、批发、引进,及运行、修改、传播其贡献者版的内容。
|
||||
在以下三段中,"专利许可"指通过任何方式明确表达的不行使专利权(如对使用专利的明确许可和不起诉专利侵权的契约)的协议或承诺。对某方"授予"专利许可,指这种不对其行使专利权的协议或承诺。
|
||||
如果你转发的受保护作品已知依赖于某专利,而其相应的源码并不是任何人都能根据本协议从网上或其他地方免费获得,那你必须(1)以上述方式提供相应的源码;或者(2)放弃从该程序的专利许可中获得利益;或者(3)以某种和本协议相一致的方式将专利许可扩展到下游接收者。"已知依赖于"指你实际上知道若没有专利许可,你在某国家转发受保护作品的行为,或者接收者在某国家使用受保护作品的行为,会侵犯一项或多项该国认定的专利,而这些专利你有理由相信它们的有效性。
|
||||
如果根据一项事务或安排,抑或与之相关,你转发某受保护作品,或通过促成其转手以实现传播,并且该作品的接收方授予专利许可,以使指可以使用、传播、修改或转发该作品的特定副本,则此等专利许可将自动延伸及每一个收到该作品或其派生作品的人。
|
||||
如果某专利在其涵盖范围内,不包含本协议专门赋予的一项或多项权利,禁止行使它们或以不行使它们为前提,则该专利是"歧视性"的。如果你和软件发布行业的第三方有合作,合作要求你就转发受保护作品的情况向其付费,并授予作品接收方歧视性专利,而且该专利(a)与你转发的副本(或在此基础上制作的副本)有关,或针对包含该受保护作品的产品或联合作品,你不得转发本程序,除非参加此项合作或取得该专利早于2007年3月28日。
|
||||
本协议的任何部分不应被解释成在排斥或限制任何暗含的授权,或者其他在适用法律下对抗侵权的措施。
|
||||
|
||||
十二、不得牺牲他人的自由
|
||||
|
||||
即便你面临与本协议条款冲突的条件(来自于法庭要求、协议或其他),那也不能成为你违背本协议的理由。倘若你不能在转发受保护作品时同时满足本协议和其他文件的要求,你就不能转发本程序。例如,当你同意了某些要求你就再转发问题向你的转发对象收取版税的条款时,唯一能同时满足它和本协议要求的做法便是不转发本程序。
|
||||
|
||||
十三、和GNU Affero通用公共许可协议一起使用
|
||||
|
||||
尽管已存在本协议的一些条款,你可以将任何受保护作品与以GNU Affero通用公共许可协议管理的作品关联或组合成一个联合作品,并转发。本协议对其中的受保护作品部分仍然有效,但GNU Affero通用公共许可协议第十三条的关于网络交互的特别要求适用于整个联合作品。
|
||||
|
||||
十四、本协议的修订版
|
||||
|
||||
自由软件联盟可能会不定时发布GNU通用公共许可协议的修订版或新版。新版将秉承当前版本的精神,但对问题或事项的描述细节不尽相同。
|
||||
每一版都会有不同的版本号,如果本程序指定其使用的GNU通用公共许可协议的版本"或任何更新的版本",你可以选择遵守该版本或者任何更新的版本的条款。如果本程序没有指定协议版本,你可以选用自由软件联盟发布的任意版本的GNU通用公共许可协议。
|
||||
如果本程序指定代理来决定将来那个GNU通用公共许可协议版本适用,则该代理的公开声明将指导你选择协议版本。
|
||||
新的版本可能会给予你额外或不同的许可。但是,任何作者或版权持有人的义务,不会因为你选择新的版本而增加。
|
||||
|
||||
十五、不提供品质担保
|
||||
|
||||
本程序在适用法律范围内不提供品质担保。除非另作书面声明,版权持有人及其他程序提供者"概"不提供任何显式或隐式的品质担保,品质担保所指包括而不仅限于有经济价值和适合特定用途的保证。全部风险,如程序的质量和性能问题,皆由你承担。若程序出现缺陷,你将承担所有必要的修复和更正服务的费用。
|
||||
|
||||
十六、责任范围
|
||||
|
||||
除非适用法律或书面协议要求,任何版权持有人或本程序按本协议可能存在的第三方修改和再发布者,都不对你的损失负有责任,包括由于使用或者不能使用本程序造成的任何一般的、特殊的、偶发的或重大的损失(包括而不仅限于数据丢失、数据失真、你或第三方的后续损失、其他程序无法与本程序协同运作),即使那些人声称会对此负责
|
||||
|
||||
十七、第十五条和第十六条的解释
|
||||
|
||||
如果上述免责声明和责任范围声明不为地方法律所支持,上诉法庭应采用与之最接近的关于放弃本程序相关民事责任的地方法律,除非本程序附带收费的品质担保或责任许诺。
|
||||
【附录:如何将上述条款应用到你的新程序】
|
||||
|
||||
如果你开发了一个新程序,并希望它能最大限度地为公众所使用,最好的办法是将其作为自由软件,以使每个人都能在本协议约束下对其再发布及修改。
|
||||
为此,请在附上以下声明。最安全的做法是将其附在每份源码的开头,以便于最有效地传递免责信息。同时,每个文件至少包含一处"版权"声明和一个协议全文的链接。
|
||||
|
||||
<用一行来标明程序名及其作用>
|
||||
版权所有(C)<年份> <作者姓名>
|
||||
本程序为自由软件,在自由软件联盟发布的GNU通用公共许可协议的约束下,你可以对其进行再发布及修改。协议版本为第三版或(随你)更新的版本。
|
||||
我们希望发布的这款程序有用,但不保证,甚至不保证它有经济价值和适合特定用途。详情参见GNU通用公共许可协议。
|
||||
你理当已收到一份GNU通用公共许可协议的副本,如果没有,请查阅<http://www.gnu.org/licenses/>
|
||||
|
||||
同时提供你的电子邮件地址或传统的邮件联系方式。
|
||||
|
||||
如果该程序是交互式的,让它在交互模式下输出类似下面的一段声明:
|
||||
|
||||
<程序名> 第69版,版权所有(C)<年份> <作者姓名>
|
||||
本程序从未提供品质担保,输入'show w'可查看详情。这是款自由软件,欢迎你在满足一定条件后对其再发布,输入'show c'可查看详情。
|
||||
|
||||
例子中的命令'show w'和'show c'应用于显示GNU通用公共许可协议相应的部分。当然你也可以因地制宜地选用别的方式,对图形界面程序可以用"关于"菜单。
|
||||
|
||||
如果你之上存在雇主(你是码农)或校方,你还应当让他们在必要时为此程序签署放弃版权声明。详情参见<http://www.gnu.org/licenses/>。
|
||||
|
||||
本GNU通用公共许可协议不允许把你的程序并入私有程序。如果你的程序是某种库,且你想允许它被私有程序链接而使之更有用,请使用GNU较宽松通用公共许可协议。决定前请先查阅<http://www.gnu.org/philosophy/why-not-lgpl.html>。
|
||||
|
||||
翻译:阮坤良<peterrk@pku.edu.cn>
|
||||
|
||||
参考:
|
||||
[繁体中文译本] https://www.gnu.org/licenses/translations.html
|
||||
|
@@ -16,6 +16,10 @@ Building of the Winamp desktop client is currently based around Visual Studio 20
|
||||
|
||||
### Dependencies
|
||||
|
||||
#### libdiscid
|
||||
|
||||
We take libdiscid from https://github.com/metabrainz/libdiscid/tree/v0.6.2, copy it in /Src/external_dependencies/libdiscid-0.6.2/
|
||||
|
||||
#### libvpx
|
||||
|
||||
We take libvpx from [https://github.com/ShiftMediaProject/libvpx](https://github.com/ShiftMediaProject/libvpx), modify it, and pack it to archive.
|
||||
|
@@ -1,67 +0,0 @@
|
||||
#include "DlgBase.h"
|
||||
|
||||
void DlgBase::MakeComboEdit(UINT id, DWORD s)
|
||||
{
|
||||
HWND w = GetDlgItem(wnd, id);
|
||||
RECT r;
|
||||
GetChildRect(id, r);
|
||||
DestroyWindow(w);
|
||||
CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", 0, WS_CHILD | s, r.left - 1, r.top - 1, r.right - r.left, r.bottom - r.top, wnd, (HMENU)id, 0, 0);
|
||||
}
|
||||
|
||||
void DlgBase::GetChildRect(UINT id, RECT& child)
|
||||
{
|
||||
RECT r_parent, r_child;
|
||||
GetWindowRect(wnd, &r_parent);
|
||||
GetWindowRect(GetDlgItem(wnd, id), &r_child);
|
||||
int dx = r_parent.left;
|
||||
int dy = r_parent.top;
|
||||
if (!(GetWindowLong(wnd, GWL_STYLE)&WS_CHILD))
|
||||
{
|
||||
dy += GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYDLGFRAME);
|
||||
dx += GetSystemMetrics(SM_CXDLGFRAME);
|
||||
}
|
||||
child.left = r_child.left - dx;
|
||||
child.right = r_child.right - dx;
|
||||
child.top = r_child.top - dy;
|
||||
child.bottom = r_child.bottom - dy;
|
||||
}
|
||||
|
||||
void DlgBase::do_sizing(UINT wp, RECT * r)
|
||||
{
|
||||
UINT dx, dy;
|
||||
dx = r->right - r->left;
|
||||
dy = r->bottom - r->top;
|
||||
if (dx < min_size_x_w)
|
||||
{
|
||||
switch (wp)
|
||||
{
|
||||
case WMSZ_BOTTOMLEFT:
|
||||
case WMSZ_LEFT:
|
||||
case WMSZ_TOPLEFT:
|
||||
r->left = r->right - min_size_x_w;
|
||||
break;
|
||||
case WMSZ_BOTTOMRIGHT:
|
||||
case WMSZ_RIGHT:
|
||||
case WMSZ_TOPRIGHT:
|
||||
r->right = r->left + min_size_x_w;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (dy < min_size_y_w)
|
||||
{
|
||||
switch (wp)
|
||||
{
|
||||
case WMSZ_BOTTOMLEFT:
|
||||
case WMSZ_BOTTOM:
|
||||
case WMSZ_BOTTOMRIGHT:
|
||||
r->bottom = r->top + min_size_y_w;
|
||||
break;
|
||||
case WMSZ_TOPLEFT:
|
||||
case WMSZ_TOP:
|
||||
case WMSZ_TOPRIGHT:
|
||||
r->top = r->bottom - min_size_y_w;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,118 +0,0 @@
|
||||
#include <windows.h>
|
||||
#include "main.h"
|
||||
|
||||
static void SetWindowRect(HWND w, RECT * r)
|
||||
{
|
||||
SetWindowPos(w, 0, r->left, r->top, r->right - r->left, r->bottom - r->top, SWP_NOZORDER | SWP_NOCOPYBITS);
|
||||
}
|
||||
|
||||
class DlgBase
|
||||
{
|
||||
public:
|
||||
BOOL isDialogMessage(MSG * m)
|
||||
{
|
||||
return wnd ? IsDialogMessage(wnd, m) : 0;
|
||||
}
|
||||
protected:
|
||||
void endDialog(int x)
|
||||
{
|
||||
EndDialog(wnd, x);
|
||||
}
|
||||
|
||||
void _do_size_x(RECT * r, UINT id, UINT wx, UINT min_x)
|
||||
{
|
||||
RECT r1 = {r->left, r->top, wx - min_x + r->right, r->bottom};
|
||||
SetWindowRect(GetDlgItem(wnd, id), &r1);
|
||||
}
|
||||
|
||||
void _do_size_xy(RECT * r, UINT id, UINT wx, UINT wy, UINT min_x, UINT min_y)
|
||||
{
|
||||
RECT r1 = {r->left, r->top, wx - min_x + r->right, wy - min_y + r->bottom};
|
||||
SetWindowRect(GetDlgItem(wnd, id), &r1);
|
||||
}
|
||||
|
||||
void _do_align_x_size_y(RECT * r, UINT id, UINT wx, UINT wy, UINT min_x, UINT min_y)
|
||||
{
|
||||
RECT r1 = {wx - min_x + r->left, r->top, wx - min_x + r->right, wy - min_y + r->bottom};
|
||||
SetWindowRect(GetDlgItem(wnd, id), &r1);
|
||||
}
|
||||
|
||||
void _do_align_x(RECT * r, UINT id, UINT wx, UINT min_x)
|
||||
{
|
||||
RECT r1 = {wx - min_x + r->left, r->top, wx - min_x + r->right, r->bottom};
|
||||
SetWindowRect(GetDlgItem(wnd, id), &r1);
|
||||
}
|
||||
|
||||
void _do_align_xy(RECT * r, UINT id, UINT wx, UINT wy, UINT min_x, UINT min_y)
|
||||
{
|
||||
RECT r1 = {wx - min_x + r->left, wy - min_y + r->top, wx - min_x + r->right, wy - min_y + r->bottom};
|
||||
SetWindowRect(GetDlgItem(wnd, id), &r1);
|
||||
}
|
||||
|
||||
#define do_size_x(id,r) _do_size_x(r,id,sx,min_size_x)
|
||||
#define do_size_xy(id,r) _do_size_xy(r,id,sx,sy,min_size_x,min_size_y)
|
||||
#define do_align_x_size_y(id,r) _do_align_x_size_y(r,id,sx,sy,min_size_x,min_size_y)
|
||||
#define do_align_xy(id,r) _do_align_xy(r,id,sx,sy,min_size_x,min_size_y)
|
||||
#define do_align_x(id,r) _do_align_x(r,id,sx,min_size_x)
|
||||
|
||||
HWND wnd;
|
||||
UINT min_size_x, min_size_y;
|
||||
UINT min_size_x_w, min_size_y_w;
|
||||
|
||||
void do_sizing(UINT wp, RECT * r);
|
||||
void MakeComboEdit(UINT id, DWORD s);
|
||||
void GetChildRect(UINT id, RECT& child);
|
||||
|
||||
virtual BOOL DlgProc(UINT msg, WPARAM wp, LPARAM lp) { return 0;};
|
||||
static BOOL CALLBACK TheDialogProc(HWND wnd, UINT msg, WPARAM wp, LPARAM lp)
|
||||
{
|
||||
DlgBase * p;
|
||||
if (msg == WM_INITDIALOG)
|
||||
{
|
||||
p = (DlgBase*)lp;
|
||||
SetWindowLong(wnd, DWL_USER, lp);
|
||||
p->wnd = wnd;
|
||||
RECT r;
|
||||
GetClientRect(wnd, &r);
|
||||
p->min_size_x = r.right;
|
||||
p->min_size_y = r.bottom;
|
||||
GetWindowRect(wnd, &r);
|
||||
p->min_size_x_w = r.right - r.left;
|
||||
p->min_size_y_w = r.bottom - r.top;
|
||||
}
|
||||
else p = (DlgBase*)GetWindowLong(wnd, DWL_USER);
|
||||
BOOL rv = 0;
|
||||
if (p)
|
||||
{
|
||||
rv = p->DlgProc(msg, wp, lp);
|
||||
if (msg == WM_DESTROY)
|
||||
{
|
||||
p->wnd = 0;
|
||||
SetWindowLong(wnd, DWL_USER, 0);
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
HWND myCreateDialog(UINT id, HWND parent)
|
||||
{
|
||||
return CreateDialogParamT(hIns, (char*)id, parent, TheDialogProc, (long)this);
|
||||
}
|
||||
virtual void myProcessMessage(MSG * msg)
|
||||
{
|
||||
if (!IsDialogMessage(wnd, msg))
|
||||
{
|
||||
TranslateMessage(msg);
|
||||
DispatchMessage(msg);
|
||||
}
|
||||
}
|
||||
|
||||
int myDialogBox(UINT id, HWND parent)
|
||||
{
|
||||
return DialogBoxParamT(hIns, (char*)id, parent, TheDialogProc, (long)this);
|
||||
}
|
||||
DlgBase() {
|
||||
wnd = 0;
|
||||
min_size_x = min_size_y = min_size_x_w = min_size_y_w = 0;
|
||||
}
|
||||
virtual ~DlgBase() {}
|
||||
};
|
@@ -1,65 +0,0 @@
|
||||
#include "main.h"
|
||||
#include "decoder.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
//returns handle!=0 if successful, 0 if error
|
||||
//size will return the final nb of bytes written to the output, -1 if unknown
|
||||
__declspec( dllexport ) intptr_t winampGetExtendedRead_openW(const wchar_t *fn, int *size, int *bps, int *nch, int *srate) {
|
||||
VorbisFile * f = VorbisFile::Create(fn,false);
|
||||
if(f) {
|
||||
if(!*bps) *bps=16; // FUCKO HAX
|
||||
Decoder * d = new Decoder();
|
||||
d->Init(f, *bps, *nch, false, false);
|
||||
*nch = (int)d->nch;
|
||||
*srate = (int)d->sr;
|
||||
*bps = (int)d->bps;
|
||||
*size = (int)(f->Length() * (double)((*nch) * (*srate) * (*bps/8)));
|
||||
return (intptr_t)d;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
__declspec( dllexport ) intptr_t winampGetExtendedRead_openW_float(const wchar_t *fn, int *size, int *bps, int *nch, int *srate) {
|
||||
VorbisFile * f = VorbisFile::Create(fn,false);
|
||||
if(f) {
|
||||
Decoder * d = new Decoder();
|
||||
d->Init(f, *bps, *nch, true, false);
|
||||
*nch = (int)d->nch;
|
||||
*srate = (int)d->sr;
|
||||
*bps = (int)d->bps;
|
||||
*size = (int)(f->Length() * (double)((*nch) * (*srate) * (*bps/8)));
|
||||
return (intptr_t)d;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//returns nb of bytes read. -1 if read error (like CD ejected). if (ret<len), EOF is assumed
|
||||
__declspec( dllexport ) intptr_t winampGetExtendedRead_getData(intptr_t handle, char *dest, size_t len, int *killswitch) {
|
||||
Decoder * d = (Decoder *)handle;
|
||||
size_t used = 0;
|
||||
for(;;) {
|
||||
used += (UINT)d->Read((UINT)(len - used),dest + used);
|
||||
if(used >= len) break;
|
||||
if(!d->DoFrame()) break;
|
||||
if(*killswitch) break;
|
||||
if (used)
|
||||
return used;
|
||||
}
|
||||
return used;
|
||||
}
|
||||
|
||||
// return nonzero on success, zero on failure.
|
||||
__declspec( dllexport ) int winampGetExtendedRead_setTime(intptr_t handle, int millisecs) {
|
||||
Decoder * d = (Decoder *)handle;
|
||||
d->Flush();
|
||||
return !d->Seek(((double)millisecs) / 1000.0);
|
||||
}
|
||||
|
||||
__declspec( dllexport ) void winampGetExtendedRead_close(intptr_t handle) {
|
||||
Decoder * d = (Decoder *)handle;
|
||||
d->Flush();
|
||||
delete d->file;
|
||||
delete d;
|
||||
}
|
||||
}
|
@@ -1,264 +0,0 @@
|
||||
#include "main.h"
|
||||
#include "api__in_vorbis.h"
|
||||
#include "resource.h"
|
||||
#include <strsafe.h>
|
||||
|
||||
/*static UINT xiphframes_ids[12]={IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4,IDB_BITMAP5,IDB_BITMAP6,IDB_BITMAP7,IDB_BITMAP8,IDB_BITMAP9,IDB_BITMAP10,IDB_BITMAP11,IDB_BITMAP12};
|
||||
static HBITMAP xiphframes[12];*/
|
||||
|
||||
static UINT xiphframes_ids[12]={IDB_PNG1,IDB_PNG2,IDB_PNG3,IDB_PNG4,IDB_PNG5,IDB_PNG6,IDB_PNG7,IDB_PNG8,IDB_PNG9,IDB_PNG10,IDB_PNG11,IDB_PNG12};
|
||||
static ARGB32 *xiphframes[12] = {0};
|
||||
static HBITMAP xiphframesBmp[12] = {0};
|
||||
|
||||
static void slap(HWND wnd,int v)
|
||||
{
|
||||
long hi=GetWindowLong(wnd,4);
|
||||
if (v) hi+=v*1000;
|
||||
else hi=0;
|
||||
SetWindowLong(wnd,4,hi);
|
||||
}
|
||||
|
||||
static CfgInt cfg_rpm("rpm",0);
|
||||
|
||||
static int visible_rpm,visible_max_rpm;
|
||||
static char show_rpm=0;
|
||||
static DWORD last_visible_rpm;
|
||||
|
||||
ARGB32 * loadImg(const void * data, int len, int *w, int *h, bool ldata=false)
|
||||
{
|
||||
FOURCC imgload = svc_imageLoader::getServiceType();
|
||||
int n = (int)mod.service->service_getNumServices(imgload);
|
||||
for(int i=0; i<n; i++)
|
||||
{
|
||||
waServiceFactory *sf = mod.service->service_enumService(imgload,i);
|
||||
if(sf)
|
||||
{
|
||||
svc_imageLoader * l = (svc_imageLoader*)sf->getInterface();
|
||||
if(l)
|
||||
{
|
||||
if(l->testData(data,len))
|
||||
{
|
||||
ARGB32* ret;
|
||||
if(ldata) ret = l->loadImageData(data,len,w,h);
|
||||
else ret = l->loadImage(data,len,w,h);
|
||||
sf->releaseInterface(l);
|
||||
return ret;
|
||||
}
|
||||
sf->releaseInterface(l);
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ARGB32 * loadRrc(int id, wchar_t * sec, int *w, int *h, bool data=false)
|
||||
{
|
||||
DWORD size=0;
|
||||
HGLOBAL resourceHandle = WASABI_API_LOADRESFROMFILEW(sec, MAKEINTRESOURCEW(id), &size);
|
||||
if(resourceHandle)
|
||||
{
|
||||
ARGB32* ret = loadImg(resourceHandle,size,w,h,data);
|
||||
UnlockResource(resourceHandle);
|
||||
return ret;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static LRESULT WINAPI XiphProc(HWND wnd,UINT msg,WPARAM wp,LPARAM lp)
|
||||
{
|
||||
switch(msg)
|
||||
{
|
||||
case WM_CREATE:
|
||||
SetWindowLong(wnd,8,last_visible_rpm=GetTickCount());
|
||||
SetTimer(wnd,666,10,0);
|
||||
visible_rpm=-1;
|
||||
visible_max_rpm=-1;
|
||||
show_rpm=0;
|
||||
break;
|
||||
case WM_TIMER:
|
||||
if (wp==666)
|
||||
{
|
||||
long low=GetWindowLong(wnd,0);
|
||||
long hi=GetWindowLong(wnd,4);
|
||||
|
||||
long org=low&~0xFFFF;
|
||||
|
||||
int rpm=MulDiv(abs(hi),1000*60,12*0x10000);
|
||||
|
||||
DWORD t=GetTickCount();
|
||||
DWORD ot=(DWORD)SetWindowLong(wnd,8,t);
|
||||
bool redraw=0;
|
||||
|
||||
if (rpm>25) show_rpm=1;
|
||||
if (cfg_rpm<rpm) cfg_rpm=rpm;
|
||||
|
||||
if (show_rpm && (t&~0x3F)!=(ot&~0x3F))
|
||||
{
|
||||
wchar_t foo[128] = {0};
|
||||
if (visible_rpm<rpm || (visible_rpm>rpm && (t-last_visible_rpm)>333))
|
||||
{
|
||||
last_visible_rpm=t;
|
||||
visible_rpm=rpm;
|
||||
StringCchPrintfW(foo,128,WASABI_API_LNGSTRINGW(IDS_GAME_SPEED),rpm);
|
||||
SetDlgItemTextW(GetParent(wnd),IDC_RPM,foo);
|
||||
}
|
||||
if (visible_max_rpm!=cfg_rpm)
|
||||
{
|
||||
visible_max_rpm=cfg_rpm;
|
||||
StringCchPrintfW(foo,128,WASABI_API_LNGSTRINGW(IDS_BEST_RPM),(int)cfg_rpm);
|
||||
SetDlgItemTextW(GetParent(wnd),IDC_RPM2,foo);
|
||||
}
|
||||
}
|
||||
|
||||
low+=hi*(t-ot);
|
||||
while(low<0) low+=12*0x10000;
|
||||
while(low>=12*0x10000) low-=12*0x10000;
|
||||
|
||||
{
|
||||
int z=hi>>6;
|
||||
if (z) hi-=z;
|
||||
else if (hi>0) hi--;
|
||||
else if (hi<0) hi++;
|
||||
}
|
||||
|
||||
SetWindowLong(wnd,0,low);
|
||||
SetWindowLong(wnd,4,hi);
|
||||
if (redraw || (low&~0xFFFF)!=org)
|
||||
{
|
||||
RedrawWindow(wnd,0,0,RDW_INVALIDATE);
|
||||
}
|
||||
KillTimer(wnd,666);
|
||||
SetTimer(wnd,666,10,0);
|
||||
}
|
||||
break;
|
||||
case WM_LBUTTONDOWN:
|
||||
slap(wnd,-1);
|
||||
break;
|
||||
case WM_RBUTTONDOWN:
|
||||
slap(wnd,1);
|
||||
break;
|
||||
case WM_MBUTTONDOWN:
|
||||
slap(wnd,0);
|
||||
break;
|
||||
case WM_PAINT:
|
||||
{
|
||||
int i=(GetWindowLong(wnd,0))>>16;
|
||||
HDC dc = CreateCompatibleDC(0);
|
||||
|
||||
if (!xiphframesBmp[i])
|
||||
{
|
||||
int cur_w = 0, cur_h = 0;
|
||||
xiphframes[i] = loadRrc(xiphframes_ids[i], L"PNG", &cur_w, &cur_h, true);
|
||||
|
||||
BITMAPINFO bmi = {0};
|
||||
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||
bmi.bmiHeader.biWidth = cur_w;
|
||||
bmi.bmiHeader.biHeight = -cur_h;
|
||||
bmi.bmiHeader.biPlanes = 1;
|
||||
bmi.bmiHeader.biBitCount = 32;
|
||||
bmi.bmiHeader.biCompression = BI_RGB;
|
||||
void *bits = 0;
|
||||
if(xiphframesBmp[i]) DeleteObject(xiphframesBmp[i]);
|
||||
xiphframesBmp[i] = CreateDIBSection(dc, &bmi, DIB_RGB_COLORS, &bits, NULL, 0);
|
||||
memcpy(bits, xiphframes[i], cur_w * cur_h * 4);
|
||||
}
|
||||
|
||||
if (xiphframesBmp[i])
|
||||
{
|
||||
HGDIOBJ foo = SelectObject(dc, xiphframesBmp[i]);
|
||||
HDC wdc = GetDC(wnd);
|
||||
RECT r = {0};
|
||||
GetClientRect(wnd, &r);
|
||||
FillRect(wdc, &r, GetSysColorBrush(COLOR_3DFACE));
|
||||
|
||||
BLENDFUNCTION blendFn = {0};
|
||||
blendFn.BlendOp = AC_SRC_OVER;
|
||||
blendFn.SourceConstantAlpha = 255;
|
||||
blendFn.AlphaFormat = AC_SRC_ALPHA;
|
||||
AlphaBlend(wdc, 2, 2, r.right - 2, r.bottom - 2, dc, 0, 0, 63, 63, blendFn);
|
||||
|
||||
ReleaseDC(wnd, wdc);
|
||||
SelectObject(dc, foo);
|
||||
}
|
||||
DeleteDC(dc);
|
||||
}
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
{
|
||||
for (int i = 0; i < ARRAYSIZE(xiphframes_ids); i++)
|
||||
{
|
||||
if(xiphframesBmp[i]) DeleteObject(xiphframesBmp[i]); xiphframesBmp[i] = 0;
|
||||
if(xiphframes[i] && WASABI_API_MEMMGR) WASABI_API_MEMMGR->sysFree((void *)xiphframes[i]); xiphframes[i] = 0;
|
||||
}
|
||||
KillTimer(wnd,666);
|
||||
break;
|
||||
}
|
||||
};
|
||||
return DefWindowProc(wnd,msg,wp,lp);
|
||||
}
|
||||
|
||||
static BOOL CALLBACK AboutProc(HWND wnd,UINT msg,WPARAM wp,LPARAM lp)
|
||||
{
|
||||
switch(msg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
wchar_t tmp[1024] = {0}, tmp2[1024] = {0}, *t1 = tmp, *t2 = tmp2, text[1024] = {0};
|
||||
SetWindowTextW(wnd,WASABI_API_LNGSTRINGW_BUF(IDS_NULLSOFT_VORBIS_DECODER_OLD,text,1024));
|
||||
StringCchPrintfW(tmp,1024,WASABI_API_LNGSTRINGW(IDS_ABOUT_TEXT),mod.description,__DATE__);
|
||||
// due to quirks with the more common resource editors, is easier to just store the string
|
||||
// internally only with \n and post-process to be \r\n (as here) so it will appear correctly
|
||||
// on new lines as is wanted (silly multiline edit controls)
|
||||
while(t1 && *t1 && (t2 - tmp2 < 1024))
|
||||
{
|
||||
if(*t1 == L'\n')
|
||||
{
|
||||
*t2 = L'\r';
|
||||
t2 = CharNextW(t2);
|
||||
}
|
||||
*t2 = *t1;
|
||||
t1 = CharNextW(t1);
|
||||
t2 = CharNextW(t2);
|
||||
}
|
||||
|
||||
SetDlgItemTextW(wnd,IDC_ABOUT_TEXT,tmp2);
|
||||
// fixes the incorrect selection of the text on dialog opening
|
||||
PostMessage(GetDlgItem(wnd,IDC_ABOUT_TEXT),EM_SETSEL,-1,0);
|
||||
return 1;
|
||||
}
|
||||
case WM_COMMAND:
|
||||
if (wp==IDOK || wp==IDCANCEL)
|
||||
{
|
||||
do_cfg(1);
|
||||
EndDialog(wnd,0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void About(HWND hwndParent)
|
||||
{
|
||||
static char got_xiph;
|
||||
if (!got_xiph)
|
||||
{
|
||||
WNDCLASS wc=
|
||||
{
|
||||
0,
|
||||
XiphProc,
|
||||
0,
|
||||
12,
|
||||
WASABI_API_LNG_HINST,
|
||||
0,
|
||||
LoadCursor(0,IDC_ARROW),
|
||||
0,
|
||||
0,
|
||||
L"XIPH_CLASS",
|
||||
};
|
||||
|
||||
RegisterClassW(&wc);
|
||||
got_xiph=1;
|
||||
}
|
||||
|
||||
WASABI_API_DIALOGBOXW(IDD_ABOUT,hwndParent,AboutProc);
|
||||
}
|
@@ -1,21 +0,0 @@
|
||||
#ifndef NULLSOFT_API_H
|
||||
#define NULLSOFT_API_H
|
||||
|
||||
#include "../Agave/Config/api_config.h"
|
||||
#include "../Agave/Language/api_language.h"
|
||||
|
||||
#include <api/application/api_application.h>
|
||||
extern api_application *applicationApi;
|
||||
#define WASABI_API_APP applicationApi
|
||||
|
||||
#include <api/service/svcs/svc_imgload.h>
|
||||
|
||||
#include <api/service/api_service.h>
|
||||
|
||||
#include <api/service/waServiceFactory.h>
|
||||
|
||||
#include <api/memmgr/api_memmgr.h>
|
||||
extern api_memmgr *memmgrApi;
|
||||
#define WASABI_API_MEMMGR memmgrApi
|
||||
|
||||
#endif
|
@@ -1,96 +0,0 @@
|
||||
#define STRICT
|
||||
#include <windows.h>
|
||||
#include <malloc.h>
|
||||
#include <stdio.h>
|
||||
#include "c_string.h"
|
||||
#include "../nu/ns_wc.h"
|
||||
|
||||
extern BOOL is_nt;
|
||||
|
||||
template<class myChar>
|
||||
void string_base<myChar>::makespace(UINT s)
|
||||
{
|
||||
if (size<s)
|
||||
{
|
||||
int oldSize = size;
|
||||
do size<<=1; while(size<s);
|
||||
myChar *newPtr = (myChar*)realloc(ptr,size*sizeof(myChar));
|
||||
if (!newPtr)
|
||||
{
|
||||
newPtr = (myChar*)malloc(size*sizeof(myChar));
|
||||
if (newPtr)
|
||||
{
|
||||
memcpy(newPtr, ptr, oldSize*sizeof(myChar));
|
||||
free(ptr);
|
||||
ptr = newPtr;
|
||||
}
|
||||
else return ;
|
||||
}
|
||||
else ptr = newPtr;
|
||||
}
|
||||
}
|
||||
|
||||
void String::s_GetWindowText(HWND w)
|
||||
{
|
||||
Reset();
|
||||
int len=GetWindowTextLengthA(w)+1;
|
||||
GetWindowTextA(w,StringTempA(*this,len),len);
|
||||
}
|
||||
|
||||
void StringW::s_GetWindowText(HWND w)
|
||||
{
|
||||
Reset();
|
||||
int len=GetWindowTextLengthW(w)+1;
|
||||
GetWindowTextW(w,StringTempW(*this,len),len);
|
||||
}
|
||||
|
||||
void String::SetStringW(const WCHAR * c)
|
||||
{
|
||||
UINT len=(lstrlenW(c)+1)*2;
|
||||
WideCharToMultiByteSZ(CP_ACP,0,c,-1,StringTempA(*this,len),len,0,0);
|
||||
}
|
||||
|
||||
void StringW::SetStringA(const char * c)
|
||||
{
|
||||
UINT len=(UINT)strlen(c)+1;
|
||||
MultiByteToWideCharSZ(CP_ACP,0,c,-1,StringTempW(*this,len),len);
|
||||
}
|
||||
|
||||
void String::AddStringW(const WCHAR * c)
|
||||
{
|
||||
AddString(String(c));
|
||||
}
|
||||
|
||||
void StringW::AddStringA(const char * c)
|
||||
{
|
||||
AddString(StringW(c));
|
||||
}
|
||||
|
||||
void String::s_SetWindowText(HWND w)
|
||||
{
|
||||
SetWindowTextA(w,*this);
|
||||
}
|
||||
|
||||
void StringW::s_SetWindowText(HWND w)
|
||||
{
|
||||
SetWindowTextW(w,*this);
|
||||
}
|
||||
|
||||
|
||||
StringPrintf::StringPrintf(const char * fmt,...)
|
||||
{
|
||||
va_list list;
|
||||
va_start(list,fmt);
|
||||
vsprintf(StringTempA(*this,1024),fmt,list);
|
||||
va_end(list);
|
||||
}
|
||||
|
||||
StringPrintfW::StringPrintfW(const WCHAR * fmt,...)
|
||||
{
|
||||
va_list list;
|
||||
va_start(list,fmt);
|
||||
vswprintf(StringTempW(*this,1024),1024,fmt,list);
|
||||
va_end(list);
|
||||
}
|
||||
|
||||
String::String(const StringW & z) {AddStringW(z);}
|
@@ -1,156 +0,0 @@
|
||||
#pragma once
|
||||
template <class myChar>
|
||||
class string_base
|
||||
{
|
||||
private:
|
||||
myChar * ptr;
|
||||
UINT size,used;
|
||||
void makespace(UINT s);
|
||||
static UINT mylen(const myChar * p) {UINT r=0;while(p[r]) r++;return r;}
|
||||
public:
|
||||
void AddChar(myChar c)
|
||||
{
|
||||
makespace(used+2);
|
||||
ptr[used++]=c;
|
||||
ptr[used]=0;
|
||||
}
|
||||
string_base()
|
||||
{
|
||||
used=0;
|
||||
size=128;
|
||||
ptr=(myChar*)malloc(size*sizeof(myChar));
|
||||
ptr[0]=0;
|
||||
}
|
||||
|
||||
~string_base() { if (ptr) free(ptr);}
|
||||
|
||||
operator const myChar*() const {return ptr;}
|
||||
|
||||
const myChar & operator*() const {return *ptr;}
|
||||
|
||||
UINT Length() const {return used;}
|
||||
|
||||
void AddString(const myChar * c)
|
||||
{
|
||||
UINT d=mylen(c);
|
||||
makespace(used+d+1);
|
||||
memcpy(ptr+used,c,sizeof(myChar)*d);
|
||||
used+=d;
|
||||
ptr[used]=0;
|
||||
}
|
||||
|
||||
void Reset() {Truncate(0);}
|
||||
void Truncate(UINT x) {if (used>x) {used=x;ptr[x]=0;}}
|
||||
|
||||
void SetString(const myChar * s) {Reset();AddString(s);}
|
||||
|
||||
myChar * BufferStart(UINT n)
|
||||
{
|
||||
makespace(n+1);
|
||||
memset(ptr,0,size);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
inline void BufferDone() {used=mylen(ptr);}
|
||||
|
||||
void SetChar(UINT offset,myChar c)//hack for some ghey routines
|
||||
{
|
||||
if (!c) Truncate(offset);
|
||||
else if (offset<used) ptr[offset]=c;
|
||||
}
|
||||
};
|
||||
|
||||
template<class myChar>
|
||||
class StringTemp
|
||||
{
|
||||
private:
|
||||
string_base<myChar> * parent;
|
||||
myChar * data;
|
||||
public:
|
||||
StringTemp(string_base<myChar> & s,UINT siz) {parent=&s;data=s.BufferStart(siz);}
|
||||
~StringTemp() {parent->BufferDone();}
|
||||
operator myChar* () {return data;}
|
||||
};
|
||||
|
||||
#define StringTempW StringTemp<WCHAR>
|
||||
#define StringTempA StringTemp<char>
|
||||
|
||||
class StringW;
|
||||
|
||||
class String : public string_base<char>
|
||||
{
|
||||
public:
|
||||
String() {}
|
||||
String(HWND w) {s_GetWindowText(w);}
|
||||
String(const char* z) {SetString(z);}
|
||||
String(const WCHAR* z) {SetStringW(z);}
|
||||
String(const String& z) {SetString(z);}
|
||||
String(const StringW& z);
|
||||
void AddStringW(const WCHAR * c);
|
||||
void SetStringW(const WCHAR * c);
|
||||
void s_GetWindowText(HWND w);
|
||||
void s_SetWindowText(HWND w);
|
||||
void operator=(const char * s) {SetString(s);}
|
||||
void operator+=(const char * s) {AddString(s);}
|
||||
void operator=(String & s) {SetString(s);}
|
||||
void operator+=(String & s) {AddString(s);}
|
||||
inline void s_GetDlgItemText(HWND w,UINT id) {s_GetWindowText(GetDlgItem(w,id));}
|
||||
inline void s_SetDlgItemText(HWND w,UINT id) {s_SetWindowText(GetDlgItem(w,id));}
|
||||
};
|
||||
|
||||
class StringW : public string_base<WCHAR>
|
||||
{
|
||||
public:
|
||||
StringW() {}
|
||||
StringW(HWND w) {s_GetWindowText(w);}
|
||||
StringW(const WCHAR * z) {SetString(z);}
|
||||
void AddStringA(const char * c);
|
||||
void SetStringA(const char * c);
|
||||
StringW(const char * z) {SetStringA(z);}
|
||||
StringW(const StringW & z) {SetString(z);}
|
||||
StringW(const String & z) {SetStringA(z);}
|
||||
void s_GetWindowText(HWND w);
|
||||
void s_SetWindowText(HWND w);
|
||||
void operator=(const WCHAR * s) {SetString(s);}
|
||||
void operator+=(const WCHAR * s) { if (s) AddString(s);}
|
||||
void operator=(StringW & s) {SetString(s);}
|
||||
void operator+=(StringW & s) {AddString(s);}
|
||||
inline void s_GetDlgItemText(HWND w,UINT id) {s_GetWindowText(GetDlgItem(w,id));}
|
||||
inline void s_SetDlgItemText(HWND w,UINT id) {s_SetWindowText(GetDlgItem(w,id));}
|
||||
bool reg_read(const char *name);
|
||||
void reg_write(const char *name);
|
||||
};
|
||||
|
||||
|
||||
class StringPrintf : public String
|
||||
{
|
||||
public:
|
||||
StringPrintf(const char * fmt,...);
|
||||
};
|
||||
|
||||
class StringPrintfW : public StringW
|
||||
{
|
||||
public:
|
||||
StringPrintfW(const WCHAR * fmt,...);
|
||||
};
|
||||
|
||||
template<class myChar>
|
||||
class StringF2T : public string_base<myChar>
|
||||
{
|
||||
public:
|
||||
StringF2T(const myChar * fn)
|
||||
{
|
||||
const myChar * ptr=fn,*dot=0,*src=fn;
|
||||
while(ptr && *ptr)
|
||||
{
|
||||
if (*ptr=='\\' || *ptr=='/' || *ptr==':') src=ptr+1;
|
||||
else if (*ptr=='.') dot=ptr;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
while(src && *src && (!dot || src<dot)) AddChar(*(src++));
|
||||
}
|
||||
};
|
||||
|
||||
#define StringF2T_A StringF2T<char>
|
||||
#define StringF2T_W StringF2T<WCHAR>
|
@@ -1,82 +0,0 @@
|
||||
#include <windows.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <ogg/ogg.h>
|
||||
#include <vorbis/vorbisfile.h>
|
||||
|
||||
static size_t callback_fread(void *ptr, size_t size, size_t nmemb, HANDLE hFile)
|
||||
{
|
||||
DWORD bw = 0;
|
||||
ReadFile(hFile,ptr,(DWORD)(size*nmemb),&bw,0);
|
||||
return bw/size;
|
||||
}
|
||||
|
||||
static size_t callback_write(void * ptr, size_t size, size_t nmemb, HANDLE hFile)
|
||||
{
|
||||
DWORD bw = 0;
|
||||
WriteFile(hFile,ptr,(DWORD)(size*nmemb),&bw,0);
|
||||
return bw/size;
|
||||
}
|
||||
|
||||
static int callback_fseek(HANDLE hFile, __int64 offset, int whence)
|
||||
{
|
||||
__int64 temp = offset;
|
||||
SetFilePointer(hFile,*(DWORD*)&temp,((long*)&temp+1),whence);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int callback_fclose(HANDLE f)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __int64 callback_ftell(HANDLE hFile)
|
||||
{
|
||||
__int64 ret=0;
|
||||
*(DWORD*)&ret = SetFilePointer(hFile,0,((long*)&ret+1),FILE_CURRENT);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void* callbacks[4]=
|
||||
{
|
||||
callback_fread,callback_fseek,callback_fclose,callback_ftell
|
||||
};
|
||||
|
||||
namespace ogg_helper
|
||||
{
|
||||
int num_get_tracks(HANDLE hFile/*track_indexer::callback * out,reader * r*/)
|
||||
{
|
||||
SetFilePointer(hFile,0,0,FILE_BEGIN);
|
||||
OggVorbis_File l_vf;
|
||||
memset(&l_vf,0,sizeof(l_vf));
|
||||
if (ov_open_callbacks(hFile,&l_vf,0,0,*(ov_callbacks*)callbacks))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int rv = l_vf.links;
|
||||
ov_clear(&l_vf);
|
||||
return rv;
|
||||
}
|
||||
|
||||
int query_chained_stream_offset(HANDLE hFile,int idx,__int64 * out_beginning,__int64 * out_end)
|
||||
{
|
||||
SetFilePointer(hFile,0,0,FILE_BEGIN);
|
||||
OggVorbis_File l_vf;
|
||||
memset(&l_vf,0,sizeof(l_vf));
|
||||
if (ov_open_callbacks(hFile,&l_vf,0,0,*(ov_callbacks*)callbacks))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int retval = 0;
|
||||
if (idx>=0 && idx<l_vf.links)
|
||||
{
|
||||
retval = 1;
|
||||
*out_beginning = l_vf.offsets[idx];
|
||||
*out_end = l_vf.offsets[idx+1];
|
||||
}
|
||||
|
||||
ov_clear(&l_vf);
|
||||
return retval;
|
||||
}
|
||||
}
|
@@ -1,335 +0,0 @@
|
||||
#include "main.h"
|
||||
#include "api__in_vorbis.h"
|
||||
#include "../nu/ns_wc.h"
|
||||
#include <commctrl.h>
|
||||
#include <shlobj.h>
|
||||
#include "../winamp/wa_ipc.h"
|
||||
#include "../nu/AutoChar.h"
|
||||
#include <strsafe.h>
|
||||
|
||||
int mc6_dm_names_ids[]={IDS_LEAVE_AS_IS,IDS_REMAP_6_CHANNELS,IDS_DOWNMIX_TO_4_CHANNELS,IDS_DOWNMIX_TO_2_CHANNELS_DS,IDS_DOWNMIX_TO_2_CHANNELS_DS2,IDS_DOWNMIX_TO_MONO};
|
||||
int mc6_map_names_id[]={IDS_CORRECT_FL_FC_FR_BL_BR_LFE,IDS_BROKEN_FL_FR_FC_BL_BR_LFE};
|
||||
int32_t priority_tab[7]={THREAD_PRIORITY_IDLE,THREAD_PRIORITY_LOWEST,THREAD_PRIORITY_BELOW_NORMAL,THREAD_PRIORITY_NORMAL,THREAD_PRIORITY_ABOVE_NORMAL,THREAD_PRIORITY_HIGHEST,THREAD_PRIORITY_TIME_CRITICAL};
|
||||
|
||||
char* defaultDumpDir()
|
||||
{
|
||||
static char dumpdir[MAX_PATH] = {0};
|
||||
if(FAILED(SHGetFolderPathA(NULL, CSIDL_MYMUSIC, NULL, SHGFP_TYPE_CURRENT, dumpdir)))
|
||||
{
|
||||
if(FAILED(SHGetFolderPathA(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, dumpdir)))
|
||||
{
|
||||
lstrcpynA(dumpdir, "C:\\", MAX_PATH);
|
||||
}
|
||||
}
|
||||
return dumpdir;
|
||||
}
|
||||
|
||||
CfgString
|
||||
cfg_ssave_format("ssave_format","%filename%"),
|
||||
cfg_dumpdir("dumpdir",defaultDumpDir());
|
||||
|
||||
CfgInt
|
||||
cfg_http_bsize("http_bsize",0x10000),
|
||||
cfg_fsave("fsave",0),
|
||||
cfg_abr("abr",0),
|
||||
cfg_proxy_mode("proxy_mode",2),
|
||||
cfg_prebuf1("prebuf1",50),
|
||||
cfg_prebuf2("prebuf2",75),
|
||||
cfg_httpseek2("httpseek2",0),
|
||||
cfg_fix0r("fix0r",1),
|
||||
cfg_mc6_dm("mc6_dm",0),
|
||||
cfg_mc6_map("_mc6_map",0),
|
||||
cfg_remember_infosize("remember_infosize",1),
|
||||
cfg_fullbuf("fullbuf",0),
|
||||
cfg_cur_tab("cur_tab",0);
|
||||
|
||||
static int old_preamp;
|
||||
CfgFont cfg_font("font");
|
||||
static LOGFONT cfg_font_edit;
|
||||
|
||||
BOOL CALLBACK browseEnumProc(HWND hwnd, LPARAM lParam)
|
||||
{
|
||||
char cl[32] = {0};
|
||||
GetClassNameA(hwnd, cl, ARRAYSIZE(cl));
|
||||
if (!lstrcmpiA(cl, WC_TREEVIEWA))
|
||||
{
|
||||
PostMessage(hwnd, TVM_ENSUREVISIBLE, 0, (LPARAM)TreeView_GetSelection(hwnd));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int CALLBACK browzaproc(HWND hwnd, UINT msg, LPARAM lp, LPARAM dat)
|
||||
{
|
||||
if (msg == BFFM_INITIALIZED)
|
||||
{
|
||||
SendMessageW(hwnd, BFFM_SETSELECTIONW, 1, (LPARAM)dat);
|
||||
|
||||
// this is not nice but it fixes the selection not working correctly on all OSes
|
||||
EnumChildWindows(hwnd, browseEnumProc, 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void d_browza(HWND wnd,HWND bt,wchar_t* tx)
|
||||
{
|
||||
IMalloc* pMalloc=0;
|
||||
|
||||
SHGetMalloc(&pMalloc);
|
||||
if (!pMalloc) return;
|
||||
|
||||
wchar_t dir[MAX_PATH] = {0};
|
||||
GetWindowTextW(bt,dir,MAX_PATH);
|
||||
BROWSEINFOW bi=
|
||||
{
|
||||
wnd,
|
||||
0,
|
||||
0,
|
||||
tx,
|
||||
BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE,
|
||||
browzaproc,
|
||||
(LPARAM)dir,
|
||||
0
|
||||
};
|
||||
ITEMIDLIST* li=SHBrowseForFolderW(&bi);
|
||||
if (li)
|
||||
{
|
||||
SHGetPathFromIDListW(li,dir);
|
||||
SetWindowTextW(bt,dir);
|
||||
pMalloc->Free(li);
|
||||
}
|
||||
|
||||
pMalloc->Release();
|
||||
}
|
||||
|
||||
static BOOL CALLBACK CfgProc1(HWND wnd,UINT msg,WPARAM wp,LPARAM lp)
|
||||
{
|
||||
switch(msg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
wchar_t temp[128] = {0}, cfg_dialog_name[128] = {0};
|
||||
StringCchPrintfW(cfg_dialog_name,128,WASABI_API_LNGSTRINGW(IDS_TITLE_PREFERENCES),
|
||||
WASABI_API_LNGSTRINGW_BUF(IDS_NULLSOFT_VORBIS_DECODER_OLD, temp, 128));
|
||||
SetWindowTextW(wnd,cfg_dialog_name);
|
||||
|
||||
SendDlgItemMessage(wnd,IDC_FULLBUF,BM_SETCHECK,cfg_fullbuf,0);
|
||||
|
||||
UINT n;
|
||||
HWND w=GetDlgItem(wnd,IDC_MC6_DM);
|
||||
for(n=0;n<sizeof(mc6_dm_names_ids)/sizeof(mc6_dm_names_ids[0]);n++)
|
||||
{
|
||||
SendMessageW(w,CB_ADDSTRING,0,(LPARAM)WASABI_API_LNGSTRINGW(mc6_dm_names_ids[n]));
|
||||
}
|
||||
SendMessage(w,CB_SETCURSEL,cfg_mc6_dm,0);
|
||||
|
||||
w=GetDlgItem(wnd,IDC_MC6_MAP);
|
||||
for(n=0;n<sizeof(mc6_map_names_id)/sizeof(mc6_map_names_id[0]);n++)
|
||||
{
|
||||
SendMessageW(w,CB_ADDSTRING,0,(LPARAM)WASABI_API_LNGSTRINGW(mc6_map_names_id[n]));
|
||||
}
|
||||
SendMessage(w,CB_SETCURSEL,cfg_mc6_map,0);
|
||||
|
||||
SendDlgItemMessage(wnd,IDC_AVG_BR,BM_SETCHECK,cfg_abr,0);
|
||||
|
||||
SetDlgItemInt(wnd,IDC_HTTP_BSIZE,cfg_http_bsize>>10,0);
|
||||
if (cfg_fsave) SendDlgItemMessage(wnd,IDC_FSAVE,BM_SETCHECK,1,0);
|
||||
if (cfg_fix0r) SendDlgItemMessage(wnd,IDC_FIX0R,BM_SETCHECK,1,0);
|
||||
cfg_dumpdir.s_SetDlgItemText(wnd,IDC_STREAM_SAVE);
|
||||
w=GetDlgItem(wnd,IDC_PROXY);
|
||||
SendMessageW(w,CB_ADDSTRING,0,(LPARAM)WASABI_API_LNGSTRINGW(IDS_NEVER));
|
||||
SendMessageW(w,CB_ADDSTRING,0,(LPARAM)WASABI_API_LNGSTRINGW(IDS_PORT_80_ONLY));
|
||||
SendMessageW(w,CB_ADDSTRING,0,(LPARAM)WASABI_API_LNGSTRINGW(IDS_ALWAYS));
|
||||
SendMessage(w,CB_SETCURSEL,cfg_proxy_mode,0);
|
||||
|
||||
w=GetDlgItem(wnd,IDC_SLIDER1);
|
||||
SendMessage(w,TBM_SETRANGE,0,MAKELONG(1,100));
|
||||
SendMessage(w,TBM_SETPOS,1,cfg_prebuf1);
|
||||
w=GetDlgItem(wnd,IDC_SLIDER2);
|
||||
SendMessage(w,TBM_SETRANGE,0,MAKELONG(1,100));
|
||||
SendMessage(w,TBM_SETPOS,1,cfg_prebuf2);
|
||||
|
||||
cfg_ssave_format.s_SetDlgItemText(wnd,IDC_SSAVE_FMT);
|
||||
SendMessage(wnd,WM_COMMAND,MAKEWPARAM(IDC_FSAVE,BN_CLICKED),(LPARAM)GetDlgItem(wnd,IDC_FSAVE));
|
||||
}
|
||||
return 1;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch(LOWORD(wp))
|
||||
{
|
||||
case IDC_STREAM_SAVE:
|
||||
d_browza(wnd,(HWND)lp,WASABI_API_LNGSTRINGW(IDS_SELECT_OUTPUT_DIRECTORY));
|
||||
break;
|
||||
|
||||
case IDC_SSAVE_FMT_DEF:
|
||||
SetDlgItemText(wnd,IDC_SSAVE_FMT,L"%filename%");
|
||||
break;
|
||||
|
||||
case IDC_FSAVE:
|
||||
{
|
||||
int checked = IsDlgButtonChecked(wnd,IDC_FSAVE);
|
||||
EnableWindow(GetDlgItem(wnd,IDC_STREAM_SAVE),checked);
|
||||
EnableWindow(GetDlgItem(wnd,IDC_SSAVE_FMT),checked);
|
||||
EnableWindow(GetDlgItem(wnd,IDC_SSAVE_FMT_DEF),checked);
|
||||
}
|
||||
break;
|
||||
|
||||
case IDOK:
|
||||
case IDCANCEL:
|
||||
{
|
||||
if (LOWORD(wp) == IDOK)
|
||||
{
|
||||
cfg_fullbuf=(int)SendDlgItemMessage(wnd,IDC_FULLBUF,BM_GETCHECK,0,0);
|
||||
|
||||
cfg_mc6_dm=(int)SendDlgItemMessage(wnd,IDC_MC6_DM,CB_GETCURSEL,0,0);
|
||||
cfg_mc6_map=(int)SendDlgItemMessage(wnd,IDC_MC6_MAP,CB_GETCURSEL,0,0);
|
||||
|
||||
cfg_abr=(int)SendDlgItemMessage(wnd,IDC_AVG_BR,BM_GETCHECK,0,0);
|
||||
|
||||
cfg_dumpdir.s_GetDlgItemText(wnd,IDC_STREAM_SAVE);
|
||||
cfg_http_bsize=GetDlgItemInt(wnd,IDC_HTTP_BSIZE,0,0)<<10;
|
||||
cfg_fsave=(int)SendDlgItemMessage(wnd,IDC_FSAVE,BM_GETCHECK,0,0);
|
||||
cfg_fix0r=(int)SendDlgItemMessage(wnd,IDC_FIX0R,BM_GETCHECK,0,0);
|
||||
cfg_proxy_mode=(int)SendDlgItemMessage(wnd,IDC_PROXY,CB_GETCURSEL,0,0);
|
||||
cfg_prebuf1=(int)SendDlgItemMessage(wnd,IDC_SLIDER1,TBM_GETPOS,0,0);
|
||||
cfg_prebuf2=(int)SendDlgItemMessage(wnd,IDC_SLIDER2,TBM_GETPOS,0,0);
|
||||
cfg_ssave_format.s_GetDlgItemText(wnd,IDC_SSAVE_FMT);
|
||||
}
|
||||
do_cfg(1);
|
||||
EndDialog(wnd,(LOWORD(wp) == IDOK));
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
const int controls[] =
|
||||
{
|
||||
IDC_SLIDER1,
|
||||
IDC_SLIDER2,
|
||||
};
|
||||
if (FALSE != WASABI_API_APP->DirectMouseWheel_ProcessDialogMessage(wnd, msg, wp, lp, controls, ARRAYSIZE(controls)))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern HANDLE hThread;//hack
|
||||
|
||||
void Config(HWND p)
|
||||
{
|
||||
if (WASABI_API_DIALOGBOXPARAMW(IDD_CONFIG,p,CfgProc1,0))
|
||||
{
|
||||
if (hThread) PostMessage(mod.hMainWindow,WM_USER,0,243);
|
||||
}
|
||||
}
|
||||
|
||||
int CfgVar::read_int(const char *inifile, const char *section,const char * name,int def)
|
||||
{
|
||||
return GetPrivateProfileIntA(section, name, def, inifile);
|
||||
}
|
||||
|
||||
void CfgVar::write_int(const char *inifile, const char *section, const char * name,int val)
|
||||
{
|
||||
char temp[32] = {0};
|
||||
StringCchPrintfA(temp, 32, "%d", val);
|
||||
WritePrivateProfileStringA(section, name, temp, inifile);
|
||||
}
|
||||
|
||||
void CfgVar::write_struct(const char *inifile, const char *section, const char * name, void * ptr,UINT size)
|
||||
{
|
||||
WritePrivateProfileStructA("in_vorbis", name, ptr, size, INI_FILE);
|
||||
}
|
||||
|
||||
bool CfgVar::read_struct(const char *inifile, const char *section, const char * name,void * ptr,UINT size)
|
||||
{
|
||||
return !!GetPrivateProfileStructA("in_vorbis", name, ptr, size, INI_FILE);
|
||||
}
|
||||
|
||||
void do_cfg(int s)
|
||||
{
|
||||
#define CFG_VERSION 0x10204
|
||||
|
||||
if (!s)
|
||||
{
|
||||
if (CfgVar::read_int(INI_FILE, "in_vorbis", "version",0)==CFG_VERSION)
|
||||
CfgVar::ReadConfig();
|
||||
}
|
||||
else
|
||||
{
|
||||
CfgVar::WriteConfig();
|
||||
CfgVar::write_int(INI_FILE, "in_vorbis", "version",CFG_VERSION);
|
||||
}
|
||||
}
|
||||
|
||||
CfgVar * CfgVar::list=0;
|
||||
|
||||
void CfgVar::ReadConfig()
|
||||
{
|
||||
CfgVar * p=list;
|
||||
while(p)
|
||||
{
|
||||
p->Read(p->name);
|
||||
p=p->next;
|
||||
}
|
||||
}
|
||||
|
||||
void CfgVar::WriteConfig()
|
||||
{
|
||||
CfgVar * p=list;
|
||||
while(p)
|
||||
{
|
||||
p->Write(p->name);
|
||||
p=p->next;
|
||||
}
|
||||
}
|
||||
|
||||
bool StringW::reg_read(const char * name)
|
||||
{
|
||||
char utf8_data[2048] = {0};
|
||||
wchar_t utf16_data[2048] = {0};
|
||||
GetPrivateProfileStringA("in_vorbis", name, "@default@", utf8_data, 2048, INI_FILE);
|
||||
if (!strcmp("@default@", utf8_data))
|
||||
return false;
|
||||
|
||||
MultiByteToWideCharSZ(CP_UTF8, 0, utf8_data, -1, utf16_data, 2048);
|
||||
SetString(utf16_data);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void StringW::reg_write(const char * name)
|
||||
{
|
||||
WritePrivateProfileStringA("in_vorbis", name, AutoChar((const WCHAR *)*this, CP_UTF8), INI_FILE);
|
||||
}
|
||||
|
||||
void CfgString::Read(const char * name)
|
||||
{
|
||||
reg_read(name);
|
||||
}
|
||||
|
||||
void CfgString::Write(const char * name)
|
||||
{
|
||||
StringW temp;
|
||||
if (temp.reg_read(name))
|
||||
{
|
||||
if (wcscmp(temp,*this)) reg_write(name);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (wcscmp(def,*this)) reg_write(name);
|
||||
}
|
||||
}
|
||||
|
||||
void CfgInt::Write(const char * name)
|
||||
{
|
||||
if (read_int(INI_FILE, "in_vorbis", name,def)!=value) write_int(INI_FILE, "in_vorbis",name,value);
|
||||
}
|
||||
|
||||
void CfgInt::Read(const char * name)
|
||||
{
|
||||
value=read_int(INI_FILE, "in_vorbis", name,def);
|
||||
}
|
@@ -1,567 +0,0 @@
|
||||
|
||||
/* Winamp 3 Player core api v0.1
|
||||
** (c)2000 nullsoft jcf/ct/dk
|
||||
** Notes:
|
||||
** Keep in mind that this header file is subject to change prior to the
|
||||
** release of Winamp 3. The ability to configure plug-ins has yet to be
|
||||
** added and is the first and foremost concern of the engineering team.
|
||||
*/
|
||||
|
||||
#ifndef __CORE_API_H
|
||||
#define __CORE_API_H
|
||||
/*
|
||||
// Visual C 6 makes big unaligned dlls. the following will correct it
|
||||
#ifndef _DEBUG
|
||||
// release optimizations
|
||||
// /Og (global optimizations), /Os (favor small code), /Oy (no frame pointers)
|
||||
#pragma optimize("gsy",on)
|
||||
#pragma comment(linker,"/RELEASE")
|
||||
// set the 512-byte alignment
|
||||
#pragma comment(linker,"/opt:nowin98")
|
||||
#endif
|
||||
*/
|
||||
// Use Assert in your code to catch errors that shouldn't happen, when compiled in release mode, they are #defined out
|
||||
#ifndef ASSERT
|
||||
#ifdef _DEBUG
|
||||
#define ASSERT(x) if (!(x)) MessageBox(NULL,"ASSERT FAILED: " #x,"ASSERT FAILED in " __FILE__ ,MB_OK|MB_ICONSTOP);
|
||||
#else
|
||||
#define ASSERT(x)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* CLASS DESCRIPTIONS */
|
||||
|
||||
/* WReader
|
||||
** File reader module class, ie. opens and reads files, streams
|
||||
*/
|
||||
class WReader;
|
||||
|
||||
/* WInputInfo
|
||||
** Class that returns information (length, title, metadata) about a specified file
|
||||
*/
|
||||
class WInputInfo;
|
||||
|
||||
/* WInfo_callback
|
||||
** Player's interface that provides Winamp 3 core functions to your WInputInfo classes
|
||||
*/
|
||||
class WInfo_callback;
|
||||
|
||||
/* WInputSource
|
||||
** Input Source manager base class, ie. decodes mp3's, wavs
|
||||
*/
|
||||
class WInputSource;
|
||||
|
||||
/* WOutputFilter
|
||||
** Abstract base class for any Output Filter plug-in, ie. changes pitch, converts format, outputs to speakers
|
||||
*/
|
||||
class WOutputFilter;
|
||||
|
||||
/* WPlayer_callback
|
||||
** Player's interface that provides Winamp 3 core functions to your Input Sources and Output Filter plug-ins
|
||||
** (Getting a reader for opening a file, sending stuff about what's going on to the Winamp 3 core)
|
||||
*/
|
||||
class WPlayer_callback;
|
||||
|
||||
|
||||
|
||||
|
||||
class WPlayer_callback
|
||||
{
|
||||
public:
|
||||
/* GetReader
|
||||
** Allows your Input Source and Output Filter plugins to request a reader from Winamp,
|
||||
** so you don't have to worry about opening files or streams
|
||||
*/
|
||||
virtual WReader *GetReader(char *url)=0;
|
||||
|
||||
|
||||
/* The 3 following functions allows your Input Source and Output Filter plugins to send error/warning/status
|
||||
** messages back to the Winamp 3 core
|
||||
*/
|
||||
|
||||
/* Error
|
||||
** playback should stop (soundcard driver error, etc)
|
||||
*/
|
||||
virtual void Error(char *reason)=0;
|
||||
|
||||
/* Warning
|
||||
** warning (something recoverable, like file not found, etc)
|
||||
*/
|
||||
virtual void Warning(char *warning)=0;
|
||||
|
||||
/* Status
|
||||
** status update (nothing really wrong)
|
||||
*/
|
||||
virtual void Status(char *status)=0;
|
||||
|
||||
|
||||
|
||||
|
||||
/* TitleChange
|
||||
** should be called if the current file titlename changes during the decoding
|
||||
*/
|
||||
virtual void TitleChange(char *new_title)=0;
|
||||
|
||||
/* InfoChange
|
||||
** should be called if the infos about the current file changes during the decoding
|
||||
*/
|
||||
virtual void InfoChange(char *new_info_str, int new_length)=0;
|
||||
|
||||
/* UrlChange
|
||||
** should be called if the current file associated URL changes during the decoding
|
||||
*/
|
||||
virtual void UrlChange(char *new_url)=0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
class WInfo_callback
|
||||
{
|
||||
public:
|
||||
/* GetReader
|
||||
** Allows your WInfo classes to request a reader from Winamp
|
||||
** so you don't have to worry about opening files or streams
|
||||
*/
|
||||
virtual WReader *GetReader(char *url)=0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
class WInputInfo
|
||||
{
|
||||
public:
|
||||
/* WInputInfo
|
||||
** WInputInfo constructor
|
||||
*/
|
||||
WInputInfo(){ };
|
||||
|
||||
/* m_info
|
||||
** Filled by Winamp. Pointer to WInputInfo callback function
|
||||
*/
|
||||
WInfo_callback *m_info;
|
||||
|
||||
/* Open
|
||||
** Called by Winamp to request informations about a specified media (file, url, etc...)
|
||||
** returns 0 if succesful, 1 if not
|
||||
**
|
||||
** You must open, get all information and close the specified file here and store
|
||||
** the useful information into member elements for quick access by other functions
|
||||
*/
|
||||
virtual int Open(char *url) { return 1; }
|
||||
|
||||
/* GetTitle
|
||||
** Called by Winamp to get the decoded title about the file opened
|
||||
** i.e. id3 title name, etc...
|
||||
*/
|
||||
virtual void GetTitle(char *buf, int maxlen) { if (maxlen>0) buf[0]=0; };
|
||||
|
||||
/* GetInfoString
|
||||
** Called by Winamp to get extra informations about the file opened
|
||||
** i.e. "160kbps stereo 44Khz" for MP3 files,"4 channels" for MOD files,etc...
|
||||
*/
|
||||
virtual void GetInfoString(char *buf, int maxlen) { if (maxlen>0) buf[0]=0; };
|
||||
|
||||
/* GetLength
|
||||
** Called by Winamp to retrieves media type length in milliseconds
|
||||
** returns -1 if length is undefined/infinite
|
||||
*/
|
||||
virtual int GetLength(void) { return -1; };
|
||||
|
||||
/* GetMetaData
|
||||
** Fetches metadata by attribute name (Artist, Album, Bitrate, etc...)
|
||||
** attribute names are non case-sensitive.
|
||||
** returns size of data
|
||||
*/
|
||||
virtual int GetMetaData(char *name, char *data, int data_len) { if (data&&data_len>0) *data=0; return 0; }
|
||||
|
||||
/* ~WInputInfo
|
||||
** WInputInfo virtual destructor
|
||||
*/
|
||||
//virtual ~WInputInfo() { };
|
||||
virtual void Release(int)=0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* WINAMP Output Filter NOTIFY MESSAGES
|
||||
** Messages returned to notify Output Filter plug-ins of events
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
|
||||
/* WOFNM_FILETITLECHANGE
|
||||
** Sent when the song changes
|
||||
** param1=new filename song
|
||||
** param2=new title song
|
||||
*/
|
||||
WOFNM_FILETITLECHANGE=1024,
|
||||
|
||||
/* WOFNM_ENDOFDECODE
|
||||
** Sent when decoding ends
|
||||
*/
|
||||
WOFNM_ENDOFDECODE,
|
||||
|
||||
} WOutputFilterNotifyMsg;
|
||||
|
||||
|
||||
|
||||
|
||||
class WOutputFilter
|
||||
{
|
||||
protected:
|
||||
/* WOutputFilter
|
||||
** WOutputFilter constructor
|
||||
*/
|
||||
WOutputFilter() { m_next=NULL; };
|
||||
|
||||
public:
|
||||
/* m_player
|
||||
** Filled by Winamp. Pointer to Winamp 3 core player interface
|
||||
*/
|
||||
WPlayer_callback *m_player;
|
||||
|
||||
/* m_next
|
||||
** Internally used by Winamp. Pointer to next activated Output Filter
|
||||
*/
|
||||
WOutputFilter *m_next;
|
||||
|
||||
/* ~WOutputFilter
|
||||
** WOutputFilter destructor
|
||||
*/
|
||||
//virtual ~WOutputFilter() { };
|
||||
virtual void Release(int)=0;
|
||||
|
||||
/* GetDescription
|
||||
** Retrieves your plug-in's text description
|
||||
*/
|
||||
virtual char *GetDescription() { return "Unknown"; };
|
||||
|
||||
/* ProcessSamples
|
||||
** Render data as it receives it
|
||||
** sampledata: Data to process
|
||||
** bytes: number of bytes to process
|
||||
** bps: Bits per sample (8 or 16)
|
||||
** nch: Number of channels (1 or 2)
|
||||
** srate: Sample rate in Hz
|
||||
** killswitch: Will be set to 1 by winamp if stop if requested. Poll the pointed value very often to
|
||||
** make sure Winamp doesn't hang
|
||||
**
|
||||
** Returns the number of processed bytes or -1 if unable to open the device or an error occured.
|
||||
**
|
||||
** You have to open your device (ie. Directsound) the first time this function is called.
|
||||
*/
|
||||
virtual int ProcessSamples(char *sampledata, int bytes, int *bps, int *nch, int *srate, bool *killswitch) { return bytes; }
|
||||
|
||||
/* FlushSamples
|
||||
** Flushes output buffers so that all is written
|
||||
*/
|
||||
virtual void FlushSamples(bool *killswitch) { };
|
||||
|
||||
/* Restart
|
||||
** Called by Winamp after a seek
|
||||
*/
|
||||
virtual void Restart(void) { }
|
||||
|
||||
/* GetLatency
|
||||
** Returns < 0 for a final output latency, > 0 for an additive
|
||||
*/
|
||||
virtual int GetLatency(void) { return 0; }
|
||||
|
||||
/* Pause
|
||||
** Suspends output
|
||||
*/
|
||||
virtual void Pause(int pause) { }
|
||||
|
||||
/* ShutDown
|
||||
** Completely stops output
|
||||
**
|
||||
** Close your device here (not in destructor)
|
||||
*/
|
||||
virtual void ShutDown(void) { }
|
||||
|
||||
/* SetVolume
|
||||
** Sets the volume (0 to 255)
|
||||
** return 1 if volume successfully modified
|
||||
*/
|
||||
virtual int SetVolume(int volume) { return 0; }
|
||||
|
||||
/* SetPan
|
||||
** Sets Left-Right sound balance (-127 to 127)
|
||||
** return 1 if pan successfully modified
|
||||
*/
|
||||
virtual int SetPan(int pan) { return 0; }
|
||||
|
||||
/* Notify
|
||||
** Called by Winamp to notify what's going on
|
||||
*/
|
||||
virtual void Notify(WOutputFilterNotifyMsg msg, int data1, int data2) { }
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
class WInputSource
|
||||
{
|
||||
|
||||
protected:
|
||||
/* WInputSource
|
||||
** WInputSource constructor
|
||||
*/
|
||||
WInputSource(){ };
|
||||
|
||||
|
||||
public:
|
||||
/* m_player
|
||||
** Filled by Winamp. Pointer to Winamp 3 core interface
|
||||
*/
|
||||
WPlayer_callback *m_player;
|
||||
|
||||
/* GetDescription
|
||||
** Retrieves your plug-in's text description
|
||||
*/
|
||||
virtual char *GetDescription() { return "Unknown"; };
|
||||
|
||||
/* UsesOutputFilters
|
||||
** Returns whether or not the Output Filter pipeline can be used
|
||||
*/
|
||||
virtual int UsesOutputFilters(void) { return 1; }
|
||||
|
||||
/* Open
|
||||
** Used to open and prepare input media type
|
||||
*/
|
||||
virtual int Open(char *url, bool *killswitch)=0;
|
||||
|
||||
/* GetSamples
|
||||
** This function must fill bps, nch and srate.
|
||||
** Here, you have to fill the sample_buffer with decoded data. Be sure to fill it with the specified
|
||||
** size (bytes). Use an internal buffer, etc ...
|
||||
**
|
||||
** sample_buffer: buffer to put decoded data into
|
||||
** bytes: size of the sample_buffer
|
||||
** bps: Bits par sample (8 or 16)
|
||||
** nch: Number of channels (1 or 2)
|
||||
** srate: Sample rate in Hz
|
||||
** killswitch: Will be set to 1 by winamp if stop if requested. Poll the pointed value very often to
|
||||
** make sure Winamp doesn't hang
|
||||
*/
|
||||
virtual int GetSamples(char *sample_buffer, int bytes, int *bps, int *nch, int *srate, bool *killswitch)=0;
|
||||
|
||||
/* SetVolume
|
||||
** Sets the volume (0 to 255)
|
||||
** Return 1 if volume has been set
|
||||
*/
|
||||
virtual int SetVolume(int volume) { return 0; };
|
||||
|
||||
/* SetPan
|
||||
** Sets Left-Right sound balance (-127 to 127)
|
||||
** return 1 if pan successfully modified
|
||||
*/
|
||||
virtual int SetPan(int pan) { return 0; };
|
||||
|
||||
/* SetPosition
|
||||
** Sets position in ms. returns 0 on success, 1 if seek impossible
|
||||
*/
|
||||
virtual int SetPosition(int)=0;
|
||||
|
||||
/* Pause
|
||||
** Suspends input
|
||||
*/
|
||||
virtual void Pause(int pause) { };
|
||||
|
||||
/* GetPosition
|
||||
** Retrieve position in milliseconds
|
||||
*/
|
||||
virtual int GetPosition(void) { return 0; }
|
||||
|
||||
/* GetTitle
|
||||
** Called by Winamp to get the decoded title about the file opened
|
||||
** i.e. stream name, id3 title name, etc...
|
||||
*/
|
||||
virtual void GetTitle(char *buf, int maxlen) { if(maxlen>0) buf[0]=0; };
|
||||
|
||||
/* GetInfoString
|
||||
** Called by Winamp to get extra informations about the file openend
|
||||
** i.e. "32kbps 44khz", etc...
|
||||
*/
|
||||
virtual void GetInfoString(char *buf, int maxlen) { if(maxlen>0) buf[0]=0; };
|
||||
|
||||
/* GetLength
|
||||
** Called by Winamp to retrieves media type length in milliseconds
|
||||
** returns -1 if length is undefined/infinite
|
||||
*/
|
||||
virtual int GetLength(void) { return -1; }
|
||||
|
||||
/* ~WInputSource
|
||||
** ~WInputSource virtual destructor
|
||||
*/
|
||||
//virtual ~WInputSource() { };
|
||||
virtual void Release(int)=0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
class WReader
|
||||
{
|
||||
protected:
|
||||
|
||||
/* WReader
|
||||
** WReader constructor
|
||||
*/
|
||||
WReader() { }
|
||||
|
||||
public:
|
||||
|
||||
/* m_player
|
||||
** Filled by Winamp. Pointer to Winamp 3 core interface
|
||||
*/
|
||||
WPlayer_callback *m_player;
|
||||
|
||||
/* GetDescription
|
||||
** Retrieves your plug-in's text description
|
||||
*/
|
||||
virtual char *GetDescription() { return "Unknown"; };
|
||||
|
||||
/* Open
|
||||
** Used to open a file, return 0 on success
|
||||
*/
|
||||
virtual int Open(char *url, bool *killswitch)=0;
|
||||
|
||||
/* Read
|
||||
** Returns number of BYTES read (if < length then eof or killswitch)
|
||||
*/
|
||||
virtual int Read(char *buffer, int length, bool *killswitch)=0;
|
||||
|
||||
/* GetLength
|
||||
** Returns length of the entire file in BYTES, return -1 on unknown/infinite (as for a stream)
|
||||
*/
|
||||
virtual int GetLength(void)=0;
|
||||
|
||||
/* CanSeek
|
||||
** Returns 1 if you can skip ahead in the file, 0 if not
|
||||
*/
|
||||
virtual int CanSeek(void)=0;
|
||||
|
||||
/* Seek
|
||||
** Jump to a certain absolute position
|
||||
*/
|
||||
virtual int Seek(int position, bool *killswitch)=0;
|
||||
|
||||
/* GetHeader
|
||||
** Retrieve header. Used in read_http to retrieve the HTTP header
|
||||
*/
|
||||
virtual char *GetHeader(char *name) { return 0; }
|
||||
|
||||
/* ~WReader
|
||||
** WReader virtual destructor
|
||||
*/
|
||||
//virtual ~WReader() { }
|
||||
virtual void Release(int)=0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/* DLL PLUGINS EXPORT STRUCTURES */
|
||||
|
||||
#define READ_VER 0x100
|
||||
#define IN_VER 0x100
|
||||
#define OF_VER 0x100
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* version
|
||||
** Version revision number
|
||||
*/
|
||||
int version;
|
||||
|
||||
/* description
|
||||
** Text description of the reader plug-in
|
||||
*/
|
||||
char *description;
|
||||
|
||||
/* create
|
||||
** Function pointer to create a reader module
|
||||
*/
|
||||
WReader *(*create)();
|
||||
|
||||
/* ismine
|
||||
** Determines whether or not a file should be read by this plug-in
|
||||
*/
|
||||
int (*ismine)(char *url);
|
||||
|
||||
} reader_source;
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* version
|
||||
** Version revision number
|
||||
*/
|
||||
int version;
|
||||
|
||||
/* description
|
||||
** Text description of the input plug-in
|
||||
*/
|
||||
char *description;
|
||||
|
||||
/* extension_list
|
||||
** Defines all the supported filetypes by this input plug-in
|
||||
** In semicolon delimited format ("ext;desc;ext;desc" etc).
|
||||
*/
|
||||
char *extension_list;
|
||||
|
||||
/* ismine
|
||||
** called before extension checks, to allow detection of tone://,http://, etc
|
||||
** Determines whether or not a file type should be decoded by this plug-in
|
||||
*/
|
||||
int (*ismine)(char *filename);
|
||||
|
||||
/* create
|
||||
** Function pointer to create a decoder module
|
||||
*/
|
||||
WInputSource *(*create)(void);
|
||||
|
||||
/* createinfo
|
||||
** Function pointer to create a decoder module information
|
||||
*/
|
||||
WInputInfo *(*createinfo)(void);
|
||||
|
||||
} input_source;
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* version
|
||||
** Version revision number
|
||||
*/
|
||||
int version;
|
||||
|
||||
/* description
|
||||
** Text description of the output plug-in
|
||||
*/
|
||||
char *description;
|
||||
|
||||
/* create
|
||||
** Function pointer to create an Output Filter
|
||||
*/
|
||||
WOutputFilter *(*create)();
|
||||
|
||||
} output_filter;
|
||||
|
||||
|
||||
#endif
|
@@ -1,459 +0,0 @@
|
||||
#include "main.h"
|
||||
#include "decoder.h"
|
||||
#include <math.h>
|
||||
#include <locale.h>
|
||||
#pragma warning(disable:4244)
|
||||
#include "shaper.h"
|
||||
#include "api__in_vorbis.h"
|
||||
|
||||
Decoder::~Decoder() {if (shaper) delete shaper;}
|
||||
|
||||
extern CfgInt
|
||||
cfg_mc6_dm, cfg_mc6_map;
|
||||
/*
|
||||
if (vorbis_cfg.use_hq_preamp)
|
||||
{
|
||||
sample *= pow(10., preamp_db/20);
|
||||
|
||||
//hard 6dB limiting
|
||||
if (sample < -0.5)
|
||||
sample = tanh((sample + 0.5) / (1-0.5)) * (1-0.5) - 0.5;
|
||||
else if (sample > 0.5)
|
||||
sample = tanh((sample - 0.5) / (1-0.5)) * (1-0.5) + 0.5;
|
||||
} */
|
||||
|
||||
#if 0
|
||||
static float q_tanh(float x)
|
||||
{
|
||||
double foo1, foo2;
|
||||
foo1 = pow(2.71828182845904523536028747135266, x);
|
||||
foo2 = 1.0 / foo1;
|
||||
return (foo1 -foo2) / (foo1 + foo2);
|
||||
}
|
||||
#else
|
||||
#define q_tanh tanh
|
||||
#endif
|
||||
|
||||
float VorbisFile::GetGain()
|
||||
{
|
||||
float peak;
|
||||
|
||||
vorbis_comment * c;
|
||||
float scale = 1.0f;
|
||||
c = ov_comment(&vf, -1);
|
||||
peak = 0.99f;
|
||||
if (c)
|
||||
{
|
||||
if (AGAVE_API_CONFIG->GetBool(playbackConfigGroupGUID, L"replaygain", false))
|
||||
{
|
||||
char * _peak = 0, *_gain = 0;
|
||||
float gain = 0;
|
||||
bool have_rg = 0;
|
||||
float lwing_gain = 0;
|
||||
char *gain1 = 0, *gain2 = 0, *peak1 = 0, *peak2 = 0;
|
||||
gain1 = vorbis_comment_query(c, "replaygain_album_gain", 0);
|
||||
if (!gain1) gain1 = vorbis_comment_query(c, "rg_audiophile", 0);
|
||||
gain2 = vorbis_comment_query(c, "replaygain_track_gain", 0);
|
||||
if (!gain2) gain2 = vorbis_comment_query(c, "rg_radio", 0);
|
||||
|
||||
peak1 = vorbis_comment_query(c, "replaygain_album_peak", 0);
|
||||
peak2 = vorbis_comment_query(c, "replaygain_track_peak", 0);
|
||||
switch (AGAVE_API_CONFIG->GetUnsigned(playbackConfigGroupGUID, L"replaygain_source", 0))
|
||||
{
|
||||
case 0: // track
|
||||
_gain = gain2;
|
||||
if (!_gain && !AGAVE_API_CONFIG->GetBool(playbackConfigGroupGUID, L"replaygain_preferred_only", false))
|
||||
_gain = gain1;
|
||||
_peak = peak2;
|
||||
if (!_peak && !AGAVE_API_CONFIG->GetBool(playbackConfigGroupGUID, L"replaygain_preferred_only", false))
|
||||
_peak = peak1;
|
||||
break;
|
||||
case 1: // album
|
||||
_gain = gain1;
|
||||
if (!_gain && !AGAVE_API_CONFIG->GetBool(playbackConfigGroupGUID, L"replaygain_preferred_only", false))
|
||||
_gain = gain2;
|
||||
_peak = peak1;
|
||||
if (!_peak && !AGAVE_API_CONFIG->GetBool(playbackConfigGroupGUID, L"replaygain_preferred_only", false))
|
||||
_peak = peak2;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!_peak)
|
||||
{
|
||||
_peak = vorbis_comment_query(c, "rg_peak", 0);
|
||||
}
|
||||
|
||||
_locale_t C_locale = WASABI_API_LNG->Get_C_NumericLocale();
|
||||
|
||||
if (_peak) peak = _atof_l(_peak, C_locale);
|
||||
if (_gain) gain = _atof_l(_gain, C_locale);
|
||||
|
||||
if (!_peak && !_gain)
|
||||
{
|
||||
char * l = vorbis_comment_query(c, "lwing_gain", 0);
|
||||
if (l)
|
||||
{
|
||||
lwing_gain = _atof_l(l, C_locale);
|
||||
have_rg = 1;
|
||||
}
|
||||
}
|
||||
else have_rg = 1;
|
||||
|
||||
if (!have_rg)
|
||||
{
|
||||
gain = AGAVE_API_CONFIG->GetFloat(playbackConfigGroupGUID, L"non_replaygain", -6.0f);
|
||||
}
|
||||
|
||||
scale = powf(10, (gain) / 20.0f);
|
||||
if (lwing_gain)
|
||||
scale *= lwing_gain;
|
||||
else if (have_rg)
|
||||
switch (AGAVE_API_CONFIG->GetUnsigned(playbackConfigGroupGUID, L"replaygain_mode", 1))
|
||||
{
|
||||
case 1: // apply gain, but don't clip
|
||||
if (scale*peak > 1.0) scale = 1.0 / peak;
|
||||
break;
|
||||
case 2: // normalize
|
||||
scale = 1.0 / peak;
|
||||
break;
|
||||
case 3: // no clipping
|
||||
if (peak > 1.0f)
|
||||
scale = 1.0 / peak;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return scale;
|
||||
}
|
||||
|
||||
void Decoder::process_rg()
|
||||
{
|
||||
scale = file->GetGain();
|
||||
}
|
||||
|
||||
void Decoder::setup_mc()
|
||||
{
|
||||
if (AGAVE_API_CONFIG->GetBool(playbackConfigGroupGUID, L"mono", false))
|
||||
nch = 1;
|
||||
else if (src_nch == 6)
|
||||
{
|
||||
switch (cfg_mc6_dm)
|
||||
{
|
||||
case 2:
|
||||
nch = 4;
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
nch = 2;
|
||||
break;
|
||||
case 5:
|
||||
nch = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (nch > 2 && !AGAVE_API_CONFIG->GetBool(playbackConfigGroupGUID, L"surround", true))
|
||||
nch = 2;
|
||||
}
|
||||
}
|
||||
|
||||
void Decoder::Flush()
|
||||
{
|
||||
bptr = 0;
|
||||
pcmbuf = 0;
|
||||
data = 0;
|
||||
pos = 0;
|
||||
if (shaper) {delete shaper;shaper = 0;}
|
||||
}
|
||||
|
||||
void Decoder::Init(VorbisFile * f, UINT _bits, UINT _nch, bool _useFloat, bool allowRG)
|
||||
{
|
||||
useFloat = _useFloat;
|
||||
|
||||
file = f;
|
||||
vorbis_info * i = ov_info(&file->vf, -1);
|
||||
|
||||
if (allowRG)
|
||||
process_rg();
|
||||
else
|
||||
scale = 1.0f;
|
||||
|
||||
if (useFloat)
|
||||
{
|
||||
dither = false;
|
||||
bps = 32;
|
||||
}
|
||||
else
|
||||
{
|
||||
dither = AGAVE_API_CONFIG->GetBool(playbackConfigGroupGUID, L"dither", true);
|
||||
|
||||
if (_bits)
|
||||
bps = _bits;
|
||||
else
|
||||
bps = AGAVE_API_CONFIG->GetUnsigned(playbackConfigGroupGUID, L"bits", 16);
|
||||
}
|
||||
|
||||
if (useFloat)
|
||||
{
|
||||
clipmin = -10000; // some arbitrarily large number
|
||||
clipmax = 10000; // some arbitrarily large number
|
||||
}
|
||||
else
|
||||
{
|
||||
clipmin = - (1 << (bps - 1));
|
||||
clipmax = (1 << (bps - 1)) - 1;
|
||||
}
|
||||
sr = i->rate;
|
||||
nch = src_nch = i->channels;
|
||||
Flush();
|
||||
cur_link = file->vf.current_link;
|
||||
|
||||
if (_nch)
|
||||
nch = _nch;
|
||||
else
|
||||
setup_mc();
|
||||
}
|
||||
|
||||
UINT Decoder::DataAvailable()
|
||||
{
|
||||
return data * (bps >> 3);
|
||||
}
|
||||
|
||||
int Decoder::DoFrame()
|
||||
{
|
||||
need_reopen = 0;
|
||||
while (1)
|
||||
{
|
||||
data = ov_read_float(&file->vf, &pcmbuf, 576, 0);
|
||||
if ((int)data <= 0)
|
||||
{
|
||||
if (data == OV_HOLE) {continue;}
|
||||
data = 0;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
pos = 0;
|
||||
if (cur_link != file->vf.current_link)
|
||||
{
|
||||
vorbis_info* i = ov_info(&file->vf, -1);
|
||||
if (sr != (UINT)i->rate || src_nch != (UINT)i->channels)
|
||||
{
|
||||
UINT old_nch = nch, old_sr = sr;
|
||||
if (shaper) {delete shaper;shaper = 0;}
|
||||
sr = i->rate;
|
||||
src_nch = nch = i->channels;
|
||||
setup_mc();
|
||||
if (nch != old_nch || sr != old_sr)
|
||||
{
|
||||
need_reopen = 1;
|
||||
}
|
||||
}
|
||||
process_rg();
|
||||
cur_link = file->vf.current_link;
|
||||
}
|
||||
data *= nch;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int Decoder::Read(UINT bytes, void * buf)
|
||||
{
|
||||
UINT wr = 0;
|
||||
if (buf && bytes && data > 0)
|
||||
{
|
||||
char* out = (char*)buf;
|
||||
UINT d;
|
||||
double mul;
|
||||
int ofs;
|
||||
float * img;
|
||||
|
||||
d = bytes / (bps >> 3);
|
||||
if (d > data) d = data;
|
||||
if (!d) return 0;
|
||||
data -= d;
|
||||
if (useFloat)
|
||||
{
|
||||
mul = 1.0;
|
||||
ofs = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
mul = (double)( (1 << ((bps) - 1)) - 1 );
|
||||
ofs = (bps == 8) ? 0x80 : 0;
|
||||
}
|
||||
wr += d * (bps >> 3);
|
||||
|
||||
img = (float*)alloca(sizeof(float) * nch);
|
||||
do
|
||||
{
|
||||
UINT cur_ch;
|
||||
if (nch == 1 && src_nch > 0)
|
||||
{
|
||||
UINT c;
|
||||
img[0] = 0;
|
||||
for (c = 0;c < src_nch;c++)
|
||||
{
|
||||
img[0] += pcmbuf[c][pos];
|
||||
}
|
||||
img[0] /= (float)src_nch;
|
||||
}
|
||||
else if (nch == src_nch && !(nch == 6 && cfg_mc6_dm == 1))
|
||||
{
|
||||
UINT c;
|
||||
for (c = 0;c < nch;c++)
|
||||
{
|
||||
img[c] = pcmbuf[c][pos];
|
||||
}
|
||||
}
|
||||
else if (src_nch == 6)
|
||||
{
|
||||
UINT FL, FR, C;
|
||||
if (cfg_mc6_map == 1)
|
||||
{
|
||||
FL = 0;
|
||||
FR = 1;
|
||||
C = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
FL = 0;
|
||||
C = 1;
|
||||
FR = 2;
|
||||
}
|
||||
|
||||
if (nch == 6)
|
||||
{ //remap order for correct 5.1 output
|
||||
img[0] = pcmbuf[FL][pos];
|
||||
img[1] = pcmbuf[FR][pos];
|
||||
img[2] = pcmbuf[C][pos];
|
||||
img[3] = pcmbuf[5][pos];
|
||||
img[4] = pcmbuf[3][pos];
|
||||
img[5] = pcmbuf[4][pos];
|
||||
}
|
||||
else if (nch == 2)
|
||||
{
|
||||
/*
|
||||
FL FR C BL BR LFE
|
||||
0 1 2 3 4 5
|
||||
|
||||
L,C,R,SL,SR,LFE
|
||||
0 1 2 3 4 5
|
||||
|
||||
|
||||
output:
|
||||
FL FR C LFE BL BR
|
||||
|
||||
|
||||
stereo:
|
||||
Lt=L+0.707*(V-SL-SR+LFE)
|
||||
Rt=R+0.707*(C+SL+SR+LFE)
|
||||
|
||||
|
||||
Lt=L+0.707*(C+LFE)
|
||||
Rt=R+0.707*(C+LFE)
|
||||
SLt=SL
|
||||
SRt=SR
|
||||
|
||||
*/
|
||||
if (cfg_mc6_dm == 4) //ds2
|
||||
{
|
||||
const double a = pow(10., 1.5 / 20.), b = 1 / a;
|
||||
img[0] = pcmbuf[FL][pos] + 0.707 * (pcmbuf[C][pos] - a * pcmbuf[3][pos] - b * pcmbuf[4][pos] + pcmbuf[5][pos]);
|
||||
img[1] = pcmbuf[FR][pos] + 0.707 * (pcmbuf[C][pos] + b * pcmbuf[3][pos] + a * pcmbuf[4][pos] + pcmbuf[5][pos]);
|
||||
}
|
||||
else
|
||||
{
|
||||
img[0] = pcmbuf[FL][pos] + 0.707 * (pcmbuf[C][pos] - pcmbuf[3][pos] - pcmbuf[4][pos] + pcmbuf[5][pos]);
|
||||
img[1] = pcmbuf[FR][pos] + 0.707 * (pcmbuf[C][pos] + pcmbuf[3][pos] + pcmbuf[4][pos] + pcmbuf[5][pos]);
|
||||
}
|
||||
}
|
||||
else if (nch == 4)
|
||||
{
|
||||
img[0] = pcmbuf[FL][pos] + 0.707 * (pcmbuf[C][pos] + pcmbuf[5][pos]);
|
||||
img[1] = pcmbuf[FR][pos] + 0.707 * (pcmbuf[C][pos] + pcmbuf[5][pos]);
|
||||
img[2] = pcmbuf[3][pos];
|
||||
img[3] = pcmbuf[4][pos];
|
||||
}
|
||||
}
|
||||
|
||||
for (cur_ch = 0;cur_ch < nch;cur_ch++)
|
||||
{
|
||||
float v = img[cur_ch];
|
||||
int val;
|
||||
v *= scale;
|
||||
v *= mul;
|
||||
if (dither)
|
||||
{
|
||||
if (!shaper)
|
||||
{
|
||||
//Shaper(int freq,int _nch,int min,int max,int _dtype,int pdf,double noiseamp);
|
||||
shaper = new Shaper(sr, nch, clipmin, clipmax, 2, DITHER_TRIANGLE, 0);
|
||||
}
|
||||
// double peak=0;
|
||||
val = shaper->do_shaping(v /*,&peak*/, cur_ch);
|
||||
//shaper clips for us
|
||||
}
|
||||
else
|
||||
{
|
||||
val = (int)v;
|
||||
if (val < clipmin) val = clipmin;
|
||||
else if (val > clipmax) val = clipmax;
|
||||
//1<<16 = 0x10000
|
||||
|
||||
}
|
||||
val += ofs;
|
||||
|
||||
switch (bps)
|
||||
{
|
||||
case 8:
|
||||
*(BYTE*)out = (UINT)val;
|
||||
break;
|
||||
case 16:
|
||||
*(short*)out = val;
|
||||
break;
|
||||
case 24:
|
||||
{
|
||||
((BYTE*)out)[0] = (UINT)val;
|
||||
((BYTE*)out)[1] = (UINT)val >> 8;
|
||||
((BYTE*)out)[2] = (UINT)val >> 16;
|
||||
}
|
||||
break;
|
||||
case 32:
|
||||
if (useFloat)
|
||||
{
|
||||
*(float *)out = v;
|
||||
}
|
||||
else
|
||||
{
|
||||
//*(long*)out=val;
|
||||
//break;
|
||||
*(long*)out = 0;
|
||||
}
|
||||
break;
|
||||
};
|
||||
out += (bps >> 3);
|
||||
d--;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
while (d);
|
||||
|
||||
}
|
||||
return wr;
|
||||
}
|
||||
|
||||
int VorbisFile::Seek(double p) { return ov_time_seek(&vf, p);}
|
||||
|
||||
int Decoder::Seek(double p)
|
||||
{
|
||||
Flush();
|
||||
return file->Seek(p);
|
||||
}
|
||||
|
||||
//char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count)
|
||||
const char* VorbisFile::get_meta(const char* tag, UINT c)
|
||||
{
|
||||
return vorbis_comment_query(vf.seekable ? vf.vc + vf.current_link : vf.vc, (char*)tag, c);
|
||||
}
|
@@ -1,41 +0,0 @@
|
||||
class Shaper;
|
||||
|
||||
class Decoder
|
||||
{
|
||||
private:
|
||||
void process_rg();
|
||||
void setup_mc();
|
||||
float* bptr;
|
||||
float** pcmbuf;
|
||||
Shaper * shaper;
|
||||
UINT data,pos;
|
||||
float scale;
|
||||
int cur_link;
|
||||
int cur_preamp;
|
||||
int clipmin,clipmax;
|
||||
public:
|
||||
VorbisFile * file;
|
||||
|
||||
UINT nch,sr,kbps,bps,src_nch;
|
||||
|
||||
Decoder()
|
||||
{
|
||||
memset(this,0,sizeof(*this));
|
||||
}
|
||||
|
||||
~Decoder();
|
||||
|
||||
int Seek(double p);
|
||||
int Read(UINT bytes,void * buf);
|
||||
void Flush();
|
||||
void Init(VorbisFile * f, UINT _bits=0, UINT _nch=0, bool _useFloat=false, bool allowRG=true);
|
||||
void wa2_setinfo(UINT cur_bitrate);
|
||||
|
||||
UINT DataAvailable();
|
||||
int DoFrame();
|
||||
bool need_reopen;
|
||||
int play_init();
|
||||
bool play_inited;
|
||||
bool dither;
|
||||
bool useFloat;
|
||||
};
|
@@ -1,97 +0,0 @@
|
||||
#include <windows.h>
|
||||
#include "genres.h"
|
||||
#include <shlwapi.h>
|
||||
|
||||
extern const wchar_t *INI_DIRECTORY;
|
||||
|
||||
static void file_init(wchar_t *file_path, wchar_t *fn)
|
||||
{
|
||||
PathCombineW(file_path, INI_DIRECTORY, fn);
|
||||
}
|
||||
|
||||
static char eol[2]={13,10};
|
||||
|
||||
static char get_char(HANDLE f,BOOL * eof)
|
||||
{
|
||||
DWORD br=0;
|
||||
char r=0;
|
||||
ReadFile(f,&r,1,&br,0);
|
||||
if (!br) *eof=1;
|
||||
return r;
|
||||
}
|
||||
|
||||
void genres_read(HWND wnd, wchar_t* fn)
|
||||
{
|
||||
char temp[MAX_GENRE] = {0};
|
||||
char add[MAX_GENRE] = {0};
|
||||
BOOL eof=0;
|
||||
char c = 0;
|
||||
wchar_t file_path[MAX_PATH] = {0};
|
||||
HANDLE f;
|
||||
|
||||
file_init(file_path, fn);
|
||||
|
||||
f = CreateFileW(file_path, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
|
||||
if (f==INVALID_HANDLE_VALUE) return;
|
||||
GetWindowTextA(wnd,add,MAX_GENRE);
|
||||
while(!eof)
|
||||
{
|
||||
UINT ptr=0;
|
||||
BOOL start=1;
|
||||
while(ptr<MAX_GENRE-1)
|
||||
{
|
||||
c=get_char(f,&eof);
|
||||
if (eof) break;
|
||||
if (c==10 || c==13)
|
||||
{
|
||||
if (start) continue;
|
||||
else break;
|
||||
}
|
||||
start=0;
|
||||
temp[ptr++]=c;
|
||||
}
|
||||
if (ptr)
|
||||
{
|
||||
temp[ptr]=0;
|
||||
SendMessage(wnd,CB_ADDSTRING,0, (LPARAM)temp);
|
||||
if (add[0])
|
||||
{
|
||||
if (!_stricmp(add,temp)) add[0]=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
CloseHandle(f);
|
||||
if (add[0]) SendMessage(wnd,CB_ADDSTRING,0,(LPARAM)add);
|
||||
}
|
||||
|
||||
void genres_write(HWND wnd, wchar_t* fn)
|
||||
{
|
||||
wchar_t file_path[MAX_PATH] = {0};
|
||||
char temp[MAX_GENRE] = {0};
|
||||
UINT max = 0,n = 0;
|
||||
DWORD bw = 0;
|
||||
HANDLE f;
|
||||
{
|
||||
char add[MAX_GENRE] = {0};
|
||||
GetWindowTextA(wnd,add,MAX_GENRE);
|
||||
if (!add[0]) return;
|
||||
max=(UINT)SendMessage(wnd,CB_GETCOUNT,0,0);
|
||||
for(n=0;n<max;n++)
|
||||
{
|
||||
SendMessage(wnd,CB_GETLBTEXT,n,(LPARAM)temp);
|
||||
if (!_stricmp(temp,add)) return;
|
||||
}
|
||||
SendMessage(wnd,CB_ADDSTRING,0,(LPARAM)add);
|
||||
}
|
||||
file_init(file_path, fn);
|
||||
f = CreateFileW(file_path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
|
||||
if (f==INVALID_HANDLE_VALUE) return;
|
||||
max=(UINT)SendMessage(wnd,CB_GETCOUNT,0,0);
|
||||
for(n=0;n<max;n++)
|
||||
{
|
||||
SendMessage(wnd,CB_GETLBTEXT,n,(LPARAM)temp);
|
||||
bw = 0; WriteFile(f,temp,(DWORD)strlen(temp),&bw,0);
|
||||
bw = 0; WriteFile(f,eol,2,&bw,0);
|
||||
}
|
||||
CloseHandle(f);
|
||||
}
|
@@ -1,16 +0,0 @@
|
||||
#ifndef NULLSOFT_IN_VORBIS_GENRES_H
|
||||
#define NULLSOFT_IN_VORBIS_GENRES_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void genres_read(HWND wnd, wchar_t* fn);
|
||||
void genres_write(HWND wnd, wchar_t* fn);
|
||||
#define MAX_GENRE 256
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@@ -1,596 +0,0 @@
|
||||
#include "api__in_vorbis.h"
|
||||
#include "../../..\Components\wac_network\wac_network_http_receiver_api.h"
|
||||
#include "rf.h"
|
||||
#include "main.h"
|
||||
#include "../Winamp/wa_ipc.h"
|
||||
#include <api/service/waservicefactory.h>
|
||||
#include "../nu/AutoWide.h"
|
||||
#include "../nu/AutoChar.h"
|
||||
extern CfgInt cfg_fix0r,cfg_httpseek2,cfg_proxy_mode,cfg_prebuf1,cfg_prebuf2,cfg_fsave,cfg_http_bsize;
|
||||
|
||||
#define CANSEEK
|
||||
|
||||
WORD *wdup(const char * src);//info.c
|
||||
|
||||
#define zeromem(x) memset(&x,0,sizeof(x))
|
||||
|
||||
class StreamSave
|
||||
{
|
||||
private:
|
||||
ogg_sync_state oy_src;
|
||||
ogg_stream_state os_src;
|
||||
ogg_stream_state os_dst;
|
||||
ogg_page og_src;
|
||||
ogg_page og_dst;
|
||||
ogg_packet op;
|
||||
StringW tmp_fn;
|
||||
BOOL is_temp;
|
||||
BOOL got_streams,got_delta,use_fix0r;
|
||||
ogg_int64_t pcm_delta;
|
||||
int packets,serial;
|
||||
HANDLE hFile;
|
||||
public:
|
||||
|
||||
StreamSave()
|
||||
{
|
||||
zeromem(oy_src);
|
||||
zeromem(os_src);
|
||||
zeromem(os_dst);
|
||||
zeromem(og_src);
|
||||
zeromem(og_dst);
|
||||
zeromem(op);
|
||||
got_streams=0;
|
||||
got_delta=0;
|
||||
pcm_delta=0;
|
||||
hFile=0;
|
||||
packets=0;
|
||||
serial=0;
|
||||
is_temp=1;
|
||||
|
||||
tmp_fn=cfg_dumpdir;
|
||||
if (tmp_fn[tmp_fn.Length()-1]!='\\') tmp_fn.AddChar('\\');
|
||||
|
||||
tmp_fn+=StringPrintfW(L"oggtemp%u.foo",GetTickCount64()&0xFFFF);
|
||||
|
||||
hFile=CreateFileW(tmp_fn,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN,0);
|
||||
if (hFile==INVALID_HANDLE_VALUE) hFile=0;
|
||||
else
|
||||
{
|
||||
ogg_sync_init(&oy_src);
|
||||
use_fix0r=cfg_fix0r;
|
||||
}
|
||||
};
|
||||
|
||||
void Write(void * ptr,UINT siz)
|
||||
{
|
||||
if (!hFile) return;
|
||||
|
||||
void * b=ogg_sync_buffer(&oy_src,siz);
|
||||
memcpy(b,ptr,siz);
|
||||
ogg_sync_wrote(&oy_src,siz);
|
||||
|
||||
while(ogg_sync_pageout(&oy_src,&og_src)>0)
|
||||
{
|
||||
if (!got_streams)
|
||||
{
|
||||
serial=ogg_page_serialno(&og_src);
|
||||
ogg_stream_init(&os_src,serial);
|
||||
ogg_stream_init(&os_dst,serial);
|
||||
got_streams=1;
|
||||
packets=0;
|
||||
got_delta=0;
|
||||
}
|
||||
else if (serial!=ogg_page_serialno(&og_src))
|
||||
{
|
||||
if (got_streams)
|
||||
{
|
||||
/*while(ogg_stream_flush(&os_dst,&og_dst))
|
||||
{
|
||||
write_page(dst,&og_dst,&wb);
|
||||
}*/
|
||||
|
||||
ogg_stream_clear(&os_src);
|
||||
ogg_stream_clear(&os_dst);
|
||||
}
|
||||
serial=ogg_page_serialno(&og_src);
|
||||
ogg_stream_init(&os_src,serial);
|
||||
ogg_stream_init(&os_dst,serial);
|
||||
|
||||
packets=0;
|
||||
got_delta=0;
|
||||
}
|
||||
|
||||
ogg_stream_pagein(&os_src,&og_src);
|
||||
while(ogg_stream_packetout(&os_src,&op)>0)
|
||||
{
|
||||
if (use_fix0r && !got_delta && packets>2 && op.granulepos>=0) //hack to fix saved streams
|
||||
{
|
||||
got_delta=1;
|
||||
if (op.granulepos>4096*(packets-2)) pcm_delta=op.granulepos;
|
||||
}
|
||||
if (got_delta)
|
||||
{
|
||||
if (op.granulepos>=pcm_delta) op.granulepos-=pcm_delta;
|
||||
else if (op.granulepos>0) op.granulepos=0;
|
||||
}
|
||||
ogg_stream_packetin(&os_dst,&op);
|
||||
packets++;
|
||||
}
|
||||
|
||||
while((packets==3 ? ogg_stream_flush(&os_dst,&og_dst) : ogg_stream_pageout(&os_dst,&og_dst))>0)
|
||||
{
|
||||
DWORD bw = 0;
|
||||
WriteFile(hFile,og_dst.header,og_dst.header_len,&bw,0);
|
||||
bw = 0; WriteFile(hFile,og_dst.body,og_dst.body_len,&bw,0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FixName(VorbisFile * vf,const char * streamname)
|
||||
{
|
||||
if (!hFile) return;
|
||||
CloseHandle(hFile);
|
||||
StringW fn(cfg_dumpdir);
|
||||
|
||||
if (fn[fn.Length()-1]!='\\') fn.AddChar('\\');
|
||||
|
||||
UINT n=fn.Length();
|
||||
fn+=(wchar_t *)AutoWide(vf->get_meta("TITLE", 0), CP_UTF8);
|
||||
UINT m=fn.Length();
|
||||
|
||||
while(n<m)
|
||||
{
|
||||
char * b="/\\:*?\"<>|";
|
||||
while(b && *b)
|
||||
{
|
||||
if (fn[n]==*b) {fn.SetChar(n,'_');break;}
|
||||
b++;
|
||||
}
|
||||
n++;
|
||||
};
|
||||
fn.AddStringA(".ogg");
|
||||
if (!MoveFileW(tmp_fn,fn))
|
||||
{
|
||||
DeleteFileW(fn);
|
||||
MoveFileW(tmp_fn,fn);
|
||||
}
|
||||
SetFileAttributesW(fn,FILE_ATTRIBUTE_NORMAL);
|
||||
hFile=CreateFileW(fn,GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
|
||||
|
||||
if (hFile==INVALID_HANDLE_VALUE) {hFile=0;}
|
||||
else SetFilePointer(hFile,0,0,FILE_END);
|
||||
is_temp=0;
|
||||
}
|
||||
|
||||
~StreamSave()
|
||||
{
|
||||
if (hFile)
|
||||
{
|
||||
/*if (got_streams)
|
||||
{
|
||||
while(ogg_stream_flush(&os_dst,&og_dst))
|
||||
{
|
||||
write_page(dst,&og_dst,&wb);
|
||||
}
|
||||
}*/
|
||||
|
||||
ogg_stream_clear(&os_src);
|
||||
ogg_stream_clear(&os_dst);
|
||||
|
||||
SetFilePointer(hFile,0,0,FILE_CURRENT);
|
||||
CloseHandle(hFile);
|
||||
if (is_temp) DeleteFileW(tmp_fn);
|
||||
}
|
||||
ogg_sync_clear(&oy_src);
|
||||
}
|
||||
};
|
||||
|
||||
static const char * do_proxy(const char * url)
|
||||
{
|
||||
switch(cfg_proxy_mode)
|
||||
{
|
||||
default:
|
||||
return 0;
|
||||
case 1:
|
||||
{
|
||||
const char * p=strstr(url,"://");
|
||||
if (!p) p=url;
|
||||
while(p && *p && *p!=':' && *p!='/') p++;
|
||||
if (p && *p==':')
|
||||
{
|
||||
if (atoi(p+1)!=80) return 0;
|
||||
}
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
char *x = (char *)SendMessage(mod.hMainWindow, WM_WA_IPC, 0, IPC_GET_PROXY_STRING);
|
||||
if (x == (char *)1 || !x || !*x)
|
||||
return 0;
|
||||
return x;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class VorbisFile_HTTP : public VorbisFile
|
||||
{
|
||||
protected:
|
||||
api_httpreceiver *get;
|
||||
UINT bsize;
|
||||
uint64_t len;
|
||||
UINT pos;
|
||||
UINT seekpos;
|
||||
BOOL can_seek;
|
||||
StreamSave * saver;
|
||||
virtual void Idle();
|
||||
virtual int f_seek(__int64 offset,int whence);
|
||||
virtual size_t f_read(UINT siz,void * ptr);
|
||||
virtual UINT f_tell();
|
||||
virtual UINT FileSize() {return len;}
|
||||
bool is_live;
|
||||
|
||||
public:
|
||||
virtual int GetType() {return TYPE_HTTP;}
|
||||
virtual bool IsLive() {return is_live;}
|
||||
bool http_init();
|
||||
|
||||
void do_prebuf() {VorbisFile::do_prebuf();fillbuf(bsize * cfg_prebuf1 / 100,0);}
|
||||
|
||||
VorbisFile_HTTP(UINT s, const wchar_t *u,bool is_info, bool hasauth) : VorbisFile(u,is_info), usedauth(hasauth)
|
||||
{
|
||||
get=0;
|
||||
can_seek=0;
|
||||
len=pos=seekpos=0;
|
||||
bsize=s;
|
||||
saver=0;
|
||||
m_needs_auth=0;
|
||||
lpinfo[0]=0;
|
||||
force_lpinfo[0]=0;
|
||||
is_live = false;
|
||||
memset(dlg_realm, 0, sizeof(dlg_realm));
|
||||
}
|
||||
|
||||
~VorbisFile_HTTP()
|
||||
{
|
||||
if (get)
|
||||
{
|
||||
waServiceFactory *sf = mod.service->service_getServiceByGuid(httpreceiverGUID);
|
||||
if (sf)
|
||||
sf->releaseInterface(get);
|
||||
get=0;
|
||||
}
|
||||
if (saver) delete saver;
|
||||
}
|
||||
|
||||
void fillbuf(UINT max,bool shutup);
|
||||
|
||||
size_t _http_read(char* ptr,size_t total);
|
||||
int reconnect(UINT ofs);
|
||||
virtual void post_init()
|
||||
{
|
||||
if (saver) saver->FixName(this,get->getheader("ice-name"));
|
||||
}
|
||||
|
||||
static BOOL CALLBACK httpDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
|
||||
int m_needs_auth;
|
||||
char dlg_realm[256];
|
||||
char lpinfo[256];
|
||||
char force_lpinfo[256];
|
||||
bool usedauth;
|
||||
};
|
||||
|
||||
int VorbisFile_HTTP::reconnect(UINT ofs)
|
||||
{
|
||||
// get.reset_headers();
|
||||
get->addheader("User-Agent: WinampOGG/5.24(MPEG stream compatible)");
|
||||
get->addheader("Accept:*/*");
|
||||
if (ofs>0) get->addheader(StringPrintf("Range: bytes=%u-",ofs));
|
||||
get->connect(AutoChar(url));
|
||||
|
||||
Status(WASABI_API_LNGSTRINGW(IDS_CONNECTING));
|
||||
|
||||
int st=get->run();
|
||||
if (st<0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void VorbisFile_HTTP::fillbuf(UINT max,bool shutup)
|
||||
{
|
||||
if (len>0 && pos+max>len) max=len-pos;
|
||||
while(!Aborting() && !abort_prebuf) //stop prebuffering if we wanna seek
|
||||
{
|
||||
if (!shutup)
|
||||
{
|
||||
Status(StringPrintfW(WASABI_API_LNGSTRINGW(IDS_PREBUFFERING), get->bytes_available()*100/bsize));
|
||||
}
|
||||
if (get->run()) break;
|
||||
if (Aborting() || abort_prebuf || get->bytes_available()>=(int)max) break;
|
||||
Sleep(2);
|
||||
}
|
||||
if (!shutup)
|
||||
{
|
||||
Status(0);
|
||||
}
|
||||
}
|
||||
|
||||
size_t VorbisFile_HTTP::_http_read(char* ptr,size_t total)
|
||||
{
|
||||
#ifdef CANSEEK
|
||||
if (seekpos!=-1)
|
||||
{
|
||||
UINT sp=seekpos;
|
||||
seekpos=-1;
|
||||
if (sp!=pos)
|
||||
{
|
||||
if (sp>pos && sp<=pos+get->bytes_available())
|
||||
{
|
||||
get->get_bytes(0,sp-pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (reconnect(sp))
|
||||
{
|
||||
return 0;//oh well...
|
||||
}
|
||||
}
|
||||
pos=sp;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
UINT wr=0;
|
||||
while(!Aborting() && wr<total)
|
||||
{
|
||||
int st=get->run();
|
||||
int d=get->get_bytes(ptr,(int)total-wr);
|
||||
if (st && !d) break;
|
||||
wr+=d;
|
||||
ptr+=d;
|
||||
pos+=d;
|
||||
if ((len>0 && pos>=len) || wr>=total || Aborting()) break;
|
||||
if (use_prebuf) fillbuf(bsize * cfg_prebuf2 / 100,0);
|
||||
else Sleep(1);
|
||||
}
|
||||
return wr;
|
||||
}
|
||||
|
||||
void VorbisFile_HTTP::Idle()
|
||||
{
|
||||
get->run();
|
||||
Sleep(1);
|
||||
get->run();
|
||||
Sleep(1);
|
||||
}
|
||||
|
||||
size_t VorbisFile_HTTP::f_read(UINT siz,void* ptr)
|
||||
{
|
||||
if (Aborting()) return 0;//fixme
|
||||
int i=(int)_http_read((char*)ptr,siz);
|
||||
if (i>0 && saver) saver->Write(ptr,i);
|
||||
return i;
|
||||
}
|
||||
|
||||
int VorbisFile_HTTP::f_seek(ogg_int64_t offset,int whence)
|
||||
{
|
||||
#ifdef CANSEEK
|
||||
if (can_seek)
|
||||
{
|
||||
switch(whence)
|
||||
{
|
||||
case FILE_BEGIN:
|
||||
seekpos=(int)offset;
|
||||
break;
|
||||
case FILE_END:
|
||||
seekpos=len+(int)offset;
|
||||
break;
|
||||
case FILE_CURRENT:
|
||||
seekpos=pos+(int)offset;
|
||||
break;
|
||||
}
|
||||
if (seekpos>len) seekpos=len;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
UINT VorbisFile_HTTP::f_tell()
|
||||
{
|
||||
#ifdef CANSEEK
|
||||
if (can_seek)
|
||||
{
|
||||
if (seekpos!=-1) return seekpos;
|
||||
else return pos;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
HWND GetDialogBoxParent()
|
||||
{
|
||||
HWND parent = (HWND)SendMessage(mod.hMainWindow, WM_WA_IPC, 0, IPC_GETDIALOGBOXPARENT);
|
||||
if (!parent || parent == (HWND)1)
|
||||
return mod.hMainWindow;
|
||||
return parent;
|
||||
}
|
||||
|
||||
bool VorbisFile_HTTP::http_init()
|
||||
{
|
||||
if (mod.service)
|
||||
{
|
||||
waServiceFactory *sf = mod.service->service_getServiceByGuid(httpreceiverGUID);
|
||||
if (sf) get = (api_httpreceiver *)sf->getInterface();
|
||||
}
|
||||
if (!get) return false;
|
||||
get->open(API_DNS_AUTODNS, bsize, do_proxy(AutoChar(url)));
|
||||
|
||||
if (reconnect(0))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CANSEEK
|
||||
// if (cfg_httpseek)
|
||||
{
|
||||
//need to get http headers first
|
||||
while(!memcmp(get->getallheaders(),"\0\0",2))
|
||||
{
|
||||
if (get->run()<0 || Aborting())
|
||||
{
|
||||
int reply = get->getreplycode();
|
||||
if ( reply == 401 )
|
||||
{
|
||||
api_connection *mcon=get->GetConnection();
|
||||
if ( mcon && mcon->GetReceiveBytesAvailable())
|
||||
{
|
||||
char p[1024]="";
|
||||
while ( mcon->GetReceiveBytesAvailable() )
|
||||
{
|
||||
char b[2048]="";
|
||||
mcon->ReceiveLine(b,2048);
|
||||
if ( *b )
|
||||
{
|
||||
char *t= strstr(b,"WWW-Authenticate:");
|
||||
if ( t && *t )
|
||||
{
|
||||
char *y = strstr(t,"\"");
|
||||
if ( y && *y )
|
||||
{
|
||||
y++;
|
||||
if ( *y )
|
||||
{
|
||||
char *u = strstr(y,"\"");
|
||||
if ( u && *u )
|
||||
{
|
||||
*u = 0;
|
||||
wsprintfA(p,"%s",y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( *p ) // found our realm
|
||||
{
|
||||
if (!force_lpinfo[0]) GetPrivateProfileStringA("HTTP-AUTH",p,"",force_lpinfo,sizeof(force_lpinfo),INI_FILE);
|
||||
if (!force_lpinfo[0] || lpinfo[0] || usedauth )
|
||||
{
|
||||
lstrcpynA(dlg_realm,p,sizeof(dlg_realm));
|
||||
if (!WASABI_API_DIALOGBOXPARAM(IDD_HTTPAUTH, GetDialogBoxParent(), httpDlgProc, (LPARAM)this))
|
||||
{
|
||||
force_lpinfo[0]=0;
|
||||
}
|
||||
else
|
||||
{
|
||||
WritePrivateProfileStringA("HTTP-AUTH",p,force_lpinfo,INI_FILE);
|
||||
}
|
||||
}
|
||||
Status(WASABI_API_LNGSTRINGW(IDS_AUTH_REQUIRED));
|
||||
m_needs_auth=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
//hg->get.wait(10);
|
||||
Sleep(1);
|
||||
}
|
||||
len=get->content_length();
|
||||
const char* poo=get->getheader("icy-name");
|
||||
if (poo) stream_title=poo;
|
||||
if (cfg_httpseek2 && len) can_seek=1;
|
||||
is_live=(len<=0);
|
||||
}
|
||||
#endif
|
||||
|
||||
//if (hg->len==0 || hg->len==-1) hg->can_seek=0;
|
||||
seekpos=-1;
|
||||
|
||||
if (cfg_fsave && !can_seek)
|
||||
{
|
||||
saver=new StreamSave;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
VorbisFile * VorbisFile::Create_HTTP(const char * url,bool is_info)
|
||||
{
|
||||
VorbisFile_HTTP * r=new VorbisFile_HTTP(cfg_http_bsize,AutoWide(url),is_info, false);
|
||||
if (r)
|
||||
{
|
||||
if (!r->http_init())
|
||||
{
|
||||
int trys=0;
|
||||
while ( r && r->m_needs_auth && trys++ < 2)
|
||||
{
|
||||
const char *p=strstr(url,"://");
|
||||
if (p && *p)
|
||||
{
|
||||
p += 3;
|
||||
if (p && *p)
|
||||
{
|
||||
char lurl[4096] = {0};
|
||||
wsprintfA(lurl, "http://%s@%s", r->force_lpinfo, p);
|
||||
delete r;
|
||||
r = new VorbisFile_HTTP(cfg_http_bsize,AutoWide(lurl),is_info, true);
|
||||
if (r && r->http_init())
|
||||
{
|
||||
return r;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
delete r;
|
||||
r=0;
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
BOOL CALLBACK VorbisFile_HTTP::httpDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
||||
{
|
||||
VorbisFile_HTTP *_this;
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
#ifdef WIN64
|
||||
SetWindowLong(hwndDlg, GWLP_USERDATA, (LONG)lParam);
|
||||
_this = (VorbisFile_HTTP*)(GetWindowLong(hwndDlg, GWLP_USERDATA));
|
||||
#else
|
||||
SetWindowLong(hwndDlg, GWL_USERDATA, (LONG)lParam);
|
||||
_this = (VorbisFile_HTTP*)GetWindowLong(hwndDlg, GWL_USERDATA);
|
||||
#endif
|
||||
if (_this->force_lpinfo[0])
|
||||
SetDlgItemTextA(hwndDlg,IDC_EDITAUTH,_this->force_lpinfo);
|
||||
else SetDlgItemTextA(hwndDlg,IDC_EDITAUTH,_this->lpinfo);
|
||||
SetDlgItemTextA(hwndDlg,IDC_REALM,_this->dlg_realm);
|
||||
return 1;
|
||||
|
||||
case WM_COMMAND:
|
||||
#ifdef WIN64
|
||||
_this = (VorbisFile_HTTP*)GetWindowLong(hwndDlg, GWLP_USERDATA);
|
||||
#else
|
||||
_this = (VorbisFile_HTTP*)GetWindowLong(hwndDlg, GWL_USERDATA);
|
||||
#endif
|
||||
if (LOWORD(wParam) == IDOKAUTH)
|
||||
{
|
||||
char *p;
|
||||
GetDlgItemTextA(hwndDlg,IDC_EDITAUTH,_this->force_lpinfo,sizeof(_this->force_lpinfo));
|
||||
p = strstr(_this->force_lpinfo,"\r");
|
||||
if ( p && *p ) *p=0;
|
||||
p = strstr(_this->force_lpinfo,"\n");
|
||||
if ( p && *p ) *p=0;
|
||||
EndDialog(hwndDlg,1);
|
||||
}
|
||||
else if (LOWORD(wParam) == IDCANCELAUTH)
|
||||
{
|
||||
EndDialog(hwndDlg,0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
@@ -1,415 +0,0 @@
|
||||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Polish resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_PLK)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
|
||||
#pragma code_page(1250)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#include ""version.rc2""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // Polish resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_ABOUT DIALOGEX 0, 0, 173, 113
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
CONTROL "",IDC_CUSTOM1,"XIPH_CLASS",0x0,6,8,44,40
|
||||
CTEXT "",IDC_RPM,7,56,45,8
|
||||
CTEXT "",IDC_RPM2,4,64,51,8
|
||||
LTEXT "",IDC_ABOUT_TEXT,58,8,110,85
|
||||
DEFPUSHBUTTON "OK",IDCANCEL,117,93,50,14
|
||||
END
|
||||
|
||||
IDD_HTTPAUTH DIALOGEX 0, 0, 154, 70
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Ogg Authentication"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
||||
BEGIN
|
||||
LTEXT "Realm: ",IDC_STATIC,4,4,25,8
|
||||
LTEXT "",IDC_REALM,37,4,113,8
|
||||
LTEXT "Enter your login and password in the form of:\n\tlogin:password",IDC_STATIC,4,15,146,17
|
||||
EDITTEXT IDC_EDITAUTH,4,35,146,12,ES_AUTOHSCROLL
|
||||
DEFPUSHBUTTON "OK",IDOKAUTH,4,52,50,13
|
||||
PUSHBUTTON "Cancel",IDCANCELAUTH,100,53,50,13
|
||||
END
|
||||
|
||||
IDD_INFO_DLG_NEW DIALOGEX 0, 0, 329, 238
|
||||
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
|
||||
CAPTION "Ogg Vorbis Info"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
||||
BEGIN
|
||||
LTEXT "File/URL :",-1,6,6,34,8
|
||||
EDITTEXT IDC_URL,43,5,282,12,ES_AUTOHSCROLL | ES_READONLY
|
||||
GROUPBOX "File / Stream Info",IDC_STATIC_MISC,224,20,101,120
|
||||
EDITTEXT IDC_MISC,231,30,88,107,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_BORDER
|
||||
GROUPBOX "Chained Streams",IDC_STATIC_CS,224,155,101,30
|
||||
PUSHBUTTON "<= previous",IDC_PREV_STREAM,229,167,44,13
|
||||
PUSHBUTTON "next =>",IDC_NEXT_STREAM,276,167,43,13
|
||||
CONTROL "Hide special fields",IDC_HIDE_SPEC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,229,190,73,10
|
||||
PUSHBUTTON "",IDC_MODE_TOGGLE,228,203,93,13
|
||||
PUSHBUTTON "Close",IDCANCEL,273,220,48,13
|
||||
END
|
||||
|
||||
IDD_INFO_PANEL_SIMPLE DIALOGEX 0, 0, 227, 218
|
||||
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
||||
BEGIN
|
||||
GROUPBOX "Standard Tags",IDC_STATIC_STD,3,2,219,119
|
||||
LTEXT "Title",IDC_STATIC,29,16,14,8
|
||||
EDITTEXT IDC_TITLE,48,14,168,12,ES_AUTOHSCROLL
|
||||
LTEXT "Artist",IDC_STATIC,27,32,16,8
|
||||
EDITTEXT IDC_ARTIST,48,30,168,12,ES_AUTOHSCROLL
|
||||
LTEXT "Album",IDC_STATIC,24,48,19,8
|
||||
EDITTEXT IDC_ALBUM,48,46,124,12,ES_AUTOHSCROLL
|
||||
LTEXT "Track:",IDC_STATIC_TRACK,175,48,21,8
|
||||
EDITTEXT IDC_TRACK,198,46,18,12,ES_AUTOHSCROLL
|
||||
LTEXT "Year",IDC_STATIC,28,64,16,8
|
||||
EDITTEXT IDC_DATE,48,62,56,12,ES_AUTOHSCROLL
|
||||
LTEXT "Genre",IDC_STATIC,117,64,22,8
|
||||
COMBOBOX IDC_GENRE,140,62,77,68,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
|
||||
LTEXT "Comment",IDC_STATIC,13,80,29,8
|
||||
EDITTEXT IDC_COMMENT,48,78,169,37,ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL
|
||||
GROUPBOX "Other",IDC_STATIC_TAGS,3,123,219,91
|
||||
LISTBOX IDC_LIST,10,134,207,75,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_INFO_PANEL_ADVANCED DIALOGEX 0, 0, 227, 218
|
||||
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
||||
BEGIN
|
||||
LISTBOX IDC_LIST,3,3,219,212,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_INFO DIALOGEX 0, 0, 341, 164
|
||||
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_SYSMENU
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
GROUPBOX "Advanced",IDC_STATIC,0,0,341,164
|
||||
CONTROL "",IDC_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,6,13,164,143
|
||||
LTEXT "Name:",IDC_STATIC,175,13,22,8
|
||||
EDITTEXT IDC_NAME,175,23,159,14,ES_AUTOHSCROLL
|
||||
LTEXT "Value:",IDC_STATIC,175,39,21,8
|
||||
EDITTEXT IDC_VALUE,175,49,159,90,ES_MULTILINE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL
|
||||
PUSHBUTTON "Add New",IDC_BUTTON_ADD,176,142,50,13
|
||||
PUSHBUTTON "Delete",IDC_BUTTON_DEL,230,142,50,13
|
||||
PUSHBUTTON "Delete All",IDC_BUTTON_DELALL,284,142,50,13
|
||||
END
|
||||
|
||||
IDD_CONFIG DIALOGEX 0, 0, 222, 261
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
GROUPBOX "Decoding",IDC_STATIC,4,4,214,93
|
||||
CONTROL "Buffer full files from disk",IDC_FULLBUF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,17,89,10
|
||||
CONTROL "Show average bitrate while playing",IDC_AVG_BR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,31,128,10
|
||||
GROUPBOX "5.1-Channel Input Processing",IDC_STATIC,10,44,201,47
|
||||
LTEXT "Apply conversion:",IDC_STATIC,16,58,72,8,0,WS_EX_RIGHT
|
||||
COMBOBOX IDC_MC6_DM,95,56,110,96,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
||||
LTEXT "Source channel order:",IDC_STATIC,16,75,72,8,0,WS_EX_RIGHT
|
||||
COMBOBOX IDC_MC6_MAP,95,73,110,96,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
||||
GROUPBOX "Streaming",IDC_STATIC,4,101,214,139
|
||||
LTEXT "Buffer size",IDC_STATIC,10,115,34,8
|
||||
EDITTEXT IDC_HTTP_BSIZE,48,113,28,12,ES_AUTOHSCROLL | ES_NUMBER
|
||||
LTEXT "KB",IDC_STATIC,80,115,9,8
|
||||
GROUPBOX "Prebuffering:",IDC_STATIC,10,129,201,44
|
||||
LTEXT "At start:",IDC_STATIC,16,142,31,8
|
||||
CONTROL "",IDC_SLIDER1,"msctls_trackbar32",TBS_NOTICKS | WS_TABSTOP,70,141,130,10
|
||||
LTEXT "After underrun:",IDC_STATIC,16,153,54,8
|
||||
CONTROL "",IDC_SLIDER2,"msctls_trackbar32",TBS_NOTICKS | WS_TABSTOP,70,152,130,10
|
||||
LTEXT "0%",IDC_STATIC,71,161,13,8
|
||||
LTEXT "50%",IDC_STATIC,122,161,18,8
|
||||
LTEXT "100%",IDC_STATIC,185,161,20,8
|
||||
LTEXT "Use Winamp's proxy server settings:",IDC_STATIC,10,179,120,8
|
||||
COMBOBOX IDC_PROXY,134,177,77,58,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
||||
GROUPBOX "",IDC_STATIC,10,191,201,43
|
||||
CONTROL "Save streamed files to:",IDC_FSAVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,201,89,10
|
||||
PUSHBUTTON "default",IDC_SSAVE_FMT_DEF,165,200,40,11
|
||||
PUSHBUTTON "",IDC_STREAM_SAVE,15,215,105,13
|
||||
EDITTEXT IDC_SSAVE_FMT,120,215,85,13,ES_AUTOHSCROLL
|
||||
DEFPUSHBUTTON "OK",IDOK,124,244,45,13
|
||||
PUSHBUTTON "Cancel",IDCANCEL,173,244,45,13
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO
|
||||
BEGIN
|
||||
IDD_ABOUT, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 4
|
||||
RIGHTMARGIN, 168
|
||||
TOPMARGIN, 4
|
||||
BOTTOMMARGIN, 107
|
||||
END
|
||||
|
||||
IDD_HTTPAUTH, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 4
|
||||
RIGHTMARGIN, 150
|
||||
TOPMARGIN, 4
|
||||
BOTTOMMARGIN, 66
|
||||
END
|
||||
|
||||
IDD_CONFIG, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 4
|
||||
RIGHTMARGIN, 218
|
||||
TOPMARGIN, 4
|
||||
BOTTOMMARGIN, 257
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Bitmap
|
||||
//
|
||||
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP9$(DISABLED) BITMAP "oggdrop\\120.bmp"
|
||||
#else
|
||||
IDB_BITMAP9 BITMAP "oggdrop\\120.bmp"
|
||||
#endif
|
||||
#endif
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP8$(DISABLED) BITMAP "oggdrop\\119.bmp"
|
||||
#else
|
||||
IDB_BITMAP8 BITMAP "oggdrop\\119.bmp"
|
||||
#endif
|
||||
#endif
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP7$(DISABLED) BITMAP "oggdrop\\118.bmp"
|
||||
#else
|
||||
IDB_BITMAP7 BITMAP "oggdrop\\118.bmp"
|
||||
#endif
|
||||
#endif
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP6$(DISABLED) BITMAP "oggdrop\\117.bmp"
|
||||
#else
|
||||
IDB_BITMAP6 BITMAP "oggdrop\\117.bmp"
|
||||
#endif
|
||||
#endif
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP5$(DISABLED) BITMAP "oggdrop\\116.bmp"
|
||||
#else
|
||||
IDB_BITMAP5 BITMAP "oggdrop\\116.bmp"
|
||||
#endif
|
||||
#endif
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP4$(DISABLED) BITMAP "oggdrop\\115.bmp"
|
||||
#else
|
||||
IDB_BITMAP4 BITMAP "oggdrop\\115.bmp"
|
||||
#endif
|
||||
#endif
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP3$(DISABLED) BITMAP "oggdrop\\114.bmp"
|
||||
#else
|
||||
IDB_BITMAP3 BITMAP "oggdrop\\114.bmp"
|
||||
#endif
|
||||
#endif
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP2$(DISABLED) BITMAP "oggdrop\\113.bmp"
|
||||
#else
|
||||
IDB_BITMAP2 BITMAP "oggdrop\\113.bmp"
|
||||
#endif
|
||||
#endif
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP12$(DISABLED) BITMAP "oggdrop\\123.bmp"
|
||||
#else
|
||||
IDB_BITMAP12 BITMAP "oggdrop\\123.bmp"
|
||||
#endif
|
||||
#endif
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP11$(DISABLED) BITMAP "oggdrop\\122.bmp"
|
||||
#else
|
||||
IDB_BITMAP11 BITMAP "oggdrop\\122.bmp"
|
||||
#endif
|
||||
#endif
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP10$(DISABLED) BITMAP "oggdrop\\121.bmp"
|
||||
#else
|
||||
IDB_BITMAP10 BITMAP "oggdrop\\121.bmp"
|
||||
#endif
|
||||
#endif
|
||||
#if defined(APSTUDIO_INVOKED) || defined(DISABLED)
|
||||
#if defined(APSTUDIO_INVOKED)
|
||||
IDB_BITMAP1$(DISABLED) BITMAP "oggdrop\\112.bmp"
|
||||
#else
|
||||
IDB_BITMAP1 BITMAP "oggdrop\\112.bmp"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PNG
|
||||
//
|
||||
|
||||
IDB_PNG1 PNG "oggdrop\\112.png"
|
||||
IDB_PNG2 PNG "oggdrop\\113.png"
|
||||
IDB_PNG3 PNG "oggdrop\\114.png"
|
||||
IDB_PNG4 PNG "oggdrop\\115.png"
|
||||
IDB_PNG5 PNG "oggdrop\\116.png"
|
||||
IDB_PNG6 PNG "oggdrop\\117.png"
|
||||
IDB_PNG7 PNG "oggdrop\\118.png"
|
||||
IDB_PNG8 PNG "oggdrop\\119.png"
|
||||
IDB_PNG9 PNG "oggdrop\\120.png"
|
||||
IDB_PNG10 PNG "oggdrop\\121.png"
|
||||
IDB_PNG11 PNG "oggdrop\\122.png"
|
||||
IDB_PNG12 PNG "oggdrop\\123.png"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// String Table
|
||||
//
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_NULLSOFT_VORBIS_DECODER "Nullsoft Vorbis Decoder v%s"
|
||||
65535 "{5C5BCA4E-279E-4867-8E24-58C8B186959A}"
|
||||
END
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_NULLSOFT_VORBIS_DECODER_OLD "Nullsoft Vorbis Decoder"
|
||||
IDS_FILE_ERROR "file error"
|
||||
IDS_LENGTH "Length: "
|
||||
IDS_AVERAGE_BITRATE "Average bitrate: "
|
||||
IDS_FILE_SIZE "File size: "
|
||||
IDS_NOMINAL_BITRATE "Nominal bitrate: "
|
||||
IDS_MIN_BITRATE "Min bitrate: "
|
||||
IDS_MAX_BITRATE "Max bitrate: "
|
||||
IDS_CHANNELS "Channels"
|
||||
IDS_SAMPLING_RATE "Sampling rate"
|
||||
IDS_SERIAL_NUMBER "Serial number"
|
||||
IDS_VERSION "Version"
|
||||
END
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_VENDOR "Vendor"
|
||||
IDS_TO_SIMPLE_MODE "<< to simple mode"
|
||||
IDS_TO_ADVANCED_MODE "to advanced mode >>"
|
||||
IDS_OGG_VORBIS_INFO "Ogg Vorbis info - %s"
|
||||
IDS_BEST_RPM "Best: %u RPM"
|
||||
IDS_LEAVE_AS_IS "leave as is"
|
||||
IDS_REMAP_6_CHANNELS "remap 6 channels"
|
||||
IDS_DOWNMIX_TO_4_CHANNELS "downmix to 4 channels"
|
||||
IDS_DOWNMIX_TO_2_CHANNELS_DS "downmix to 2 channels (DS)"
|
||||
IDS_DOWNMIX_TO_2_CHANNELS_DS2 "downmix to 2 channels (DS2)"
|
||||
IDS_DOWNMIX_TO_MONO "downmix to mono"
|
||||
IDS_CORRECT_FL_FC_FR_BL_BR_LFE "correct (FL FC FR BL BR LFE)"
|
||||
IDS_BROKEN_FL_FR_FC_BL_BR_LFE "broken (FL FR FC BL BR LFE)"
|
||||
END
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_ABOUT_TEXT "%s\n<> 2001-2023 Winamp SA\nWritten by: Peter Pawlowski\nBuild date: %hs\n\nThanks to:\n Craig Freer\n Tomi 'Nebularia' Jylh<6C>-Ollila\n Jack Moffitt\n Szabolcs P<>ter"
|
||||
IDS_TITLE_PREFERENCES "%s Preferences"
|
||||
IDS_NEVER "never"
|
||||
IDS_PORT_80_ONLY "port 80 only"
|
||||
IDS_ALWAYS "always"
|
||||
IDS_SELECT_OUTPUT_DIRECTORY "Select output directory:"
|
||||
END
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_CONNECTING "Connecting..."
|
||||
IDS_PREBUFFERING "Prebuffering : %u%%"
|
||||
IDS_AUTH_REQUIRED "Authentication Required"
|
||||
IDS_OGG_FILES "Ogg Vorbis Files (*.OGG;*.OGA)"
|
||||
IDS_NAME "Name"
|
||||
IDS_VALUE "Value"
|
||||
IDS_KBPS "kbps"
|
||||
IDS_HZ "Hz"
|
||||
IDS_GAME_SPEED "%u RPM"
|
||||
IDS_BYTES "bytes"
|
||||
IDS_FAMILY_STRING "Ogg Vorbis File"
|
||||
END
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
#include "version.rc2"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
@@ -1,65 +0,0 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.29424.173
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "in_vorbis", "in_vorbis.vcxproj", "{7C58AC02-7941-42BE-8F97-9BF2064D6631}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{4FC28B55-2A14-43D5-86F7-201054F338A9} = {4FC28B55-2A14-43D5-86F7-201054F338A9}
|
||||
{49238ED1-3146-49AB-9523-E9826EE4A0C8} = {49238ED1-3146-49AB-9523-E9826EE4A0C8}
|
||||
{EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4} = {EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg", "..\libogg\libogg.vcxproj", "{4FC28B55-2A14-43D5-86F7-201054F338A9}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbis_static", "..\libvorbis\win32\vorbis_static.vcxproj", "{49238ED1-3146-49AB-9523-E9826EE4A0C8}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisfile_static", "..\libvorbis\win32\vorbisfile_static.vcxproj", "{EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Debug|x64 = Debug|x64
|
||||
Release|Win32 = Release|Win32
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{7C58AC02-7941-42BE-8F97-9BF2064D6631}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{7C58AC02-7941-42BE-8F97-9BF2064D6631}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{7C58AC02-7941-42BE-8F97-9BF2064D6631}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{7C58AC02-7941-42BE-8F97-9BF2064D6631}.Release|Win32.Build.0 = Release|Win32
|
||||
{7C58AC02-7941-42BE-8F97-9BF2064D6631}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{7C58AC02-7941-42BE-8F97-9BF2064D6631}.Debug|x64.Build.0 = Debug|x64
|
||||
{7C58AC02-7941-42BE-8F97-9BF2064D6631}.Release|x64.ActiveCfg = Release|x64
|
||||
{7C58AC02-7941-42BE-8F97-9BF2064D6631}.Release|x64.Build.0 = Release|x64
|
||||
{49238ED1-3146-49AB-9523-E9826EE4A0C8}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{49238ED1-3146-49AB-9523-E9826EE4A0C8}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{49238ED1-3146-49AB-9523-E9826EE4A0C8}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{49238ED1-3146-49AB-9523-E9826EE4A0C8}.Release|Win32.Build.0 = Release|Win32
|
||||
{49238ED1-3146-49AB-9523-E9826EE4A0C8}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{49238ED1-3146-49AB-9523-E9826EE4A0C8}.Debug|x64.Build.0 = Debug|x64
|
||||
{49238ED1-3146-49AB-9523-E9826EE4A0C8}.Release|x64.ActiveCfg = Release|x64
|
||||
{49238ED1-3146-49AB-9523-E9826EE4A0C8}.Release|x64.Build.0 = Release|x64
|
||||
{EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Release|Win32.Build.0 = Release|Win32
|
||||
{EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Debug|x64.Build.0 = Debug|x64
|
||||
{EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Release|x64.ActiveCfg = Release|x64
|
||||
{EC9475D2-FEE2-4F8C-9BB9-A11D5EB597C4}.Release|x64.Build.0 = Release|x64
|
||||
{4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|Win32.Build.0 = Release|Win32
|
||||
{4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{4FC28B55-2A14-43D5-86F7-201054F338A9}.Debug|x64.Build.0 = Debug|x64
|
||||
{4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|x64.ActiveCfg = Release|x64
|
||||
{4FC28B55-2A14-43D5-86F7-201054F338A9}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {3248659F-0FFC-4CF4-A9BC-F7D10C713D5D}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
@@ -1,339 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{7C58AC02-7941-42BE-8F97-9BF2064D6631}</ProjectGuid>
|
||||
<RootNamespace>in_vorbis</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
|
||||
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
|
||||
<IncludePath>$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
|
||||
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
|
||||
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
|
||||
<IncludePath>$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
|
||||
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="Vcpkg">
|
||||
<VcpkgEnableManifest>false</VcpkgEnableManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<VcpkgInstalledDir>
|
||||
</VcpkgInstalledDir>
|
||||
<VcpkgUseStatic>false</VcpkgUseStatic>
|
||||
<VcpkgConfiguration>Debug</VcpkgConfiguration>
|
||||
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<VcpkgInstalledDir>
|
||||
</VcpkgInstalledDir>
|
||||
<VcpkgUseStatic>false</VcpkgUseStatic>
|
||||
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<VcpkgInstalledDir>
|
||||
</VcpkgInstalledDir>
|
||||
<VcpkgUseStatic>false</VcpkgUseStatic>
|
||||
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
|
||||
<VcpkgConfiguration>Debug</VcpkgConfiguration>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<VcpkgInstalledDir>
|
||||
</VcpkgInstalledDir>
|
||||
<VcpkgUseStatic>false</VcpkgUseStatic>
|
||||
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;WA2;TAGZ_UNICODE;UNICODE_INPUT_PLUGIN;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
|
||||
<ObjectFileName>$(IntDir)</ObjectFileName>
|
||||
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<DisableSpecificWarnings>4090;4312;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0415</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>shlwapi.lib;Msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<MapFileName>$(IntDir)$(TargetName).map</MapFileName>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\
|
||||
xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command>
|
||||
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;WA2;TAGZ_UNICODE;UNICODE_INPUT_PLUGIN;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
|
||||
<ObjectFileName>$(IntDir)</ObjectFileName>
|
||||
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<DisableSpecificWarnings>4090;4312;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0415</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>shlwapi.lib;Msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
|
||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<MapFileName>$(IntDir)$(TargetName).map</MapFileName>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\
|
||||
xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command>
|
||||
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;TAGZ_UNICODE;UNICODE_INPUT_PLUGIN;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
|
||||
<ObjectFileName>$(IntDir)</ObjectFileName>
|
||||
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>None</DebugInformationFormat>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<DisableSpecificWarnings>4090;4312;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0415</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>shlwapi.lib;Msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
|
||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<MapFileName>$(IntDir)$(TargetName).map</MapFileName>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command>
|
||||
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<AdditionalIncludeDirectories>.;..\..\..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;TAGZ_UNICODE;UNICODE_INPUT_PLUGIN;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
|
||||
<ObjectFileName>$(IntDir)</ObjectFileName>
|
||||
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>None</DebugInformationFormat>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<DisableSpecificWarnings>4090;4312;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0415</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>shlwapi.lib;Msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
|
||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<MapFileName>$(IntDir)$(TargetName).map</MapFileName>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
|
||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\ </Command>
|
||||
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\Plugins\'</Message>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\external_dependencies\openmpt-trunk\include\vorbis\win32\vorbisfile_static.vcxproj">
|
||||
<Project>{ec9475d2-fee2-4f8c-9bb9-a11d5eb597c4}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\Wasabi\Wasabi.vcxproj">
|
||||
<Project>{3e0bfa8a-b86a-42e9-a33f-ec294f823f7f}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\nsmkv\Lacing.cpp" />
|
||||
<ClCompile Include="..\..\..\nsmkv\vint.cpp" />
|
||||
<ClCompile Include="about.cpp" />
|
||||
<ClCompile Include="chainedstream_parse.cpp" />
|
||||
<ClCompile Include="config.cpp" />
|
||||
<ClCompile Include="c_string.cpp" />
|
||||
<ClCompile Include="decoder.cpp" />
|
||||
<ClCompile Include="ExtendedRead.cpp" />
|
||||
<ClCompile Include="genres.c" />
|
||||
<ClCompile Include="http.cpp" />
|
||||
<ClCompile Include="infobox.cpp" />
|
||||
<ClCompile Include="info_.cpp" />
|
||||
<ClCompile Include="localfile.cpp" />
|
||||
<ClCompile Include="mkv_vorbis_decoder.cpp" />
|
||||
<ClCompile Include="shaper.cpp" />
|
||||
<ClCompile Include="vcedit.c" />
|
||||
<ClCompile Include="wa2.cpp" />
|
||||
<ClCompile Include="winnt_helper.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="api__in_vorbis.h" />
|
||||
<ClInclude Include="c_string.h" />
|
||||
<ClInclude Include="decoder.h" />
|
||||
<ClInclude Include="genres.h" />
|
||||
<ClInclude Include="main.h" />
|
||||
<ClInclude Include="mkv_vorbis_decoder.h" />
|
||||
<ClInclude Include="resource.h" />
|
||||
<ClInclude Include="shaper.h" />
|
||||
<ClInclude Include="vcedit.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="in_vorbis.rc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="oggdrop\112.png" />
|
||||
<Image Include="oggdrop\113.png" />
|
||||
<Image Include="oggdrop\114.png" />
|
||||
<Image Include="oggdrop\115.png" />
|
||||
<Image Include="oggdrop\116.png" />
|
||||
<Image Include="oggdrop\117.png" />
|
||||
<Image Include="oggdrop\118.png" />
|
||||
<Image Include="oggdrop\119.png" />
|
||||
<Image Include="oggdrop\120.png" />
|
||||
<Image Include="oggdrop\121.png" />
|
||||
<Image Include="oggdrop\122.png" />
|
||||
<Image Include="oggdrop\123.png" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
@@ -1,145 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<ClCompile Include="winnt_helper.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="wa2.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="vcedit.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="shaper.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="mkv_vorbis_decoder.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="localfile.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="infobox.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="info_.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="http.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="genres.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ExtendedRead.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="decoder.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="config.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="chainedstream_parse.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="c_string.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="about.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\nsmkv\Lacing.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\nsmkv\vint.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="api__in_vorbis.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="c_string.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="decoder.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="genres.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="main.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="mkv_vorbis_decoder.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="resource.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="shaper.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="vcedit.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="oggdrop\112.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
<Image Include="oggdrop\113.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
<Image Include="oggdrop\114.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
<Image Include="oggdrop\115.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
<Image Include="oggdrop\116.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
<Image Include="oggdrop\117.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
<Image Include="oggdrop\118.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
<Image Include="oggdrop\119.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
<Image Include="oggdrop\120.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
<Image Include="oggdrop\121.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
<Image Include="oggdrop\122.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
<Image Include="oggdrop\123.png">
|
||||
<Filter>Image Files</Filter>
|
||||
</Image>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{7c471b36-309f-402b-a247-e640a094f9bc}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Ressource Files">
|
||||
<UniqueIdentifier>{735fc214-c8e5-4619-8c70-a184a8373c92}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{00aa1653-baa3-4e88-b6d1-fa408b0c4a85}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Image Files">
|
||||
<UniqueIdentifier>{32126a2c-dd90-4901-a5e1-aee5b7363e37}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="in_vorbis.rc">
|
||||
<Filter>Ressource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
@@ -1,658 +0,0 @@
|
||||
//tag editor file i/o code, title formatting interface
|
||||
#include "main.h"
|
||||
#include "genres.h"
|
||||
#include "../nu/AutoWide.h"
|
||||
#include "../nu/AutoChar.h"
|
||||
#include "../nu/ns_wc.h"
|
||||
#include "api__in_vorbis.h"
|
||||
#include <wchar.h>
|
||||
#include <math.h>
|
||||
#include <shlwapi.h>
|
||||
#include "vcedit.h"
|
||||
#include <strsafe.h>
|
||||
#include "resource.h"
|
||||
|
||||
namespace ogg_helper //chainedstream_parse
|
||||
{
|
||||
int num_get_tracks(HANDLE hFile);
|
||||
int query_chained_stream_offset(HANDLE hFile, int idx, __int64 * out_beginning, __int64 * out_end);
|
||||
}
|
||||
|
||||
/*static void xfer(HANDLE src, HANDLE dst, __int64 size)
|
||||
{
|
||||
enum { BUFFER = 1024 * 1024 };
|
||||
void * buffer = malloc((int)(BUFFER > size ? size : BUFFER));
|
||||
while (size > 0)
|
||||
{
|
||||
int d = BUFFER;
|
||||
if ((__int64)d > size) d = (int)size;
|
||||
DWORD br = 0;
|
||||
ReadFile(src, buffer, d, &br, 0);
|
||||
WriteFile(dst, buffer, d, &br, 0);
|
||||
size -= d;
|
||||
}
|
||||
}*/
|
||||
|
||||
static void seek64(HANDLE src, __int64 offset)
|
||||
{
|
||||
__int64 temp = offset;
|
||||
SetFilePointer(src, *(DWORD*)&temp, ((long*)&temp + 1), FILE_BEGIN);
|
||||
}
|
||||
|
||||
extern OSVERSIONINFO os_ver;
|
||||
extern HANDLE hThread;
|
||||
|
||||
static DWORDLONG get_space(const wchar_t * url)
|
||||
{
|
||||
ULARGE_INTEGER free_space;
|
||||
char zzz[4] = {(char)url[0], (char)url[1], (char)url[2], 0}; //"c:\";
|
||||
|
||||
free_space.QuadPart = 0;
|
||||
|
||||
if (os_ver.dwPlatformId == VER_PLATFORM_WIN32_NT || (os_ver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && LOWORD(os_ver.dwBuildNumber) > 1000))
|
||||
{
|
||||
static BOOL (WINAPI* pGetDiskFreeSpaceEx)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);
|
||||
if (!pGetDiskFreeSpaceEx)
|
||||
{
|
||||
pGetDiskFreeSpaceEx = (BOOL (WINAPI*)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER))GetProcAddress(GetModuleHandle(L"kernel32.dll"), "GetDiskFreeSpaceExA");
|
||||
}
|
||||
if (pGetDiskFreeSpaceEx)
|
||||
{
|
||||
ULARGE_INTEGER blah1, blah2;
|
||||
pGetDiskFreeSpaceEx((LPCTSTR)zzz, &free_space, &blah1, &blah2);
|
||||
}
|
||||
}
|
||||
if (!free_space.QuadPart)
|
||||
{
|
||||
DWORD spc, bps, nfc, tnc;
|
||||
GetDiskFreeSpaceA(zzz, &spc, &bps, &nfc, &tnc);
|
||||
free_space.QuadPart = UInt32x32To64(spc * bps, nfc);
|
||||
}
|
||||
return free_space.QuadPart;
|
||||
}
|
||||
|
||||
bool sync_movefile(const wchar_t * src, const wchar_t * dst);
|
||||
|
||||
struct vcedit_param
|
||||
{
|
||||
HANDLE hFile;
|
||||
__int64 remaining;
|
||||
};
|
||||
|
||||
static size_t callback_fread(void *ptr, size_t size, size_t nmemb, vcedit_param * param)
|
||||
{
|
||||
int to_read = (int)(nmemb *size);
|
||||
if (to_read > param->remaining) to_read = (int)param->remaining;
|
||||
DWORD br = 0;
|
||||
ReadFile(param->hFile, ptr, to_read, &br, 0);
|
||||
param->remaining -= br;
|
||||
return br / size;
|
||||
}
|
||||
|
||||
static size_t callback_write(const void *ptr, size_t size, size_t nmemb, HANDLE hFile)
|
||||
{
|
||||
DWORD bw = 0;
|
||||
WriteFile(hFile, ptr, (DWORD)(size*nmemb), &bw, 0);
|
||||
return bw / size;
|
||||
}
|
||||
|
||||
BOOL modify_file(const wchar_t* url, const vorbis_comment * comments, int links)
|
||||
{ //also used for stream save fix
|
||||
HANDLE dst = INVALID_HANDLE_VALUE;
|
||||
int scream = 0;
|
||||
StringW tmp;
|
||||
|
||||
winampGetExtendedFileInfoW_Cleanup();
|
||||
|
||||
tmp = url;
|
||||
tmp += L".tmp";
|
||||
|
||||
HANDLE src = CreateFileW(url, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
|
||||
|
||||
if (src != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
ULARGE_INTEGER src_size;
|
||||
src_size.LowPart = GetFileSize(src, &src_size.HighPart);
|
||||
if (src_size.QuadPart > get_space(url))
|
||||
{ //shit happens... try default temp location
|
||||
StringW tempdir;
|
||||
GetTempPathW(MAX_PATH, StringTempW(tempdir, MAX_PATH));
|
||||
if (get_space(tempdir) < src_size.QuadPart)
|
||||
{ //oh well
|
||||
CloseHandle(src);
|
||||
src = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
{
|
||||
tmp = tempdir;
|
||||
if (tmp[tmp.Length() - 1] != '\\') tmp.AddChar('\\');
|
||||
|
||||
StringCchPrintfW(StringTempW(tempdir, MAX_PATH), MAX_PATH, L"ogg%u_%u.tmp", GetTickCount(), GetCurrentProcessId());
|
||||
tmp.AddString(tempdir);
|
||||
}
|
||||
}
|
||||
dst = CreateFileW(tmp, GENERIC_WRITE | GENERIC_READ, 0, 0, CREATE_ALWAYS, 0, 0);
|
||||
}
|
||||
|
||||
if (dst != INVALID_HANDLE_VALUE && src != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
{
|
||||
FILETIME ct;
|
||||
GetFileTime(src, &ct, 0, 0);
|
||||
SetFileTime(dst, &ct, 0, 0);
|
||||
}
|
||||
|
||||
int num_links = ogg_helper::num_get_tracks(src);
|
||||
if (num_links < links) scream = 1;
|
||||
else
|
||||
{
|
||||
int cur_link;
|
||||
for (cur_link = 0; cur_link < links && !scream; cur_link++)
|
||||
{
|
||||
__int64 stream_beginning, stream_end;
|
||||
if (ogg_helper::query_chained_stream_offset(src, cur_link, &stream_beginning, &stream_end))
|
||||
{
|
||||
seek64(src, stream_beginning);
|
||||
vcedit_state *vs;
|
||||
vcedit_param param;
|
||||
param.hFile = src;
|
||||
param.remaining = stream_end - stream_beginning;
|
||||
vs = vcedit_new_state();
|
||||
if (vcedit_open_callbacks(vs, ¶m, (vcedit_read_func)callback_fread, (vcedit_write_func)callback_write) < 0)
|
||||
{
|
||||
scream = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
vorbis_comment * vc = vcedit_comments(vs);
|
||||
vorbis_comment_clear(vc);
|
||||
vorbis_comment_init(vc);
|
||||
const vorbis_comment * vc_src = comments + cur_link;
|
||||
|
||||
int n;
|
||||
for (n = 0;n < vc_src->comments;n++)
|
||||
{
|
||||
if (vc_src->user_comments[n])
|
||||
vorbis_comment_add(vc, vc_src->user_comments[n]);
|
||||
}
|
||||
|
||||
vcedit_write(vs, dst);
|
||||
vcedit_clear(vs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else scream = 1;
|
||||
if (src != INVALID_HANDLE_VALUE) CloseHandle(src);
|
||||
if (dst != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
CloseHandle(dst);
|
||||
if (scream)
|
||||
{
|
||||
DeleteFileW(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
if (!scream)
|
||||
{
|
||||
BOOL f_sync;
|
||||
EnterCriticalSection(&sync);
|
||||
|
||||
f_sync = !_wcsicmp(url, cur_file) && hThread; //check for i/o conflict with currently played file
|
||||
LeaveCriticalSection(&sync);
|
||||
if (f_sync)
|
||||
{ //drat, it's now playing
|
||||
scream = !sync_movefile(tmp, url);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!DeleteFileW(url)) scream = 1;
|
||||
else
|
||||
{
|
||||
if (!MoveFileW(tmp, url))
|
||||
{
|
||||
if (!CopyFileW(tmp, url, 0)) scream = 1;
|
||||
DeleteFileW(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scream) return 0;
|
||||
else return 1;
|
||||
}
|
||||
|
||||
wchar_t *wdup(const char * src)
|
||||
{
|
||||
return _wcsdup(StringW(src));
|
||||
}
|
||||
|
||||
extern StringW stat_disp;
|
||||
|
||||
void GetFileInfo(const wchar_t *file, wchar_t *title, int *len)
|
||||
{
|
||||
VorbisFile* vf = 0;
|
||||
BOOL is_cur_file = 0;
|
||||
BOOL is_vf_local = 1;
|
||||
if (title) *title = 0;
|
||||
if (len) *len = -1;
|
||||
|
||||
if (!file || !*file)
|
||||
{
|
||||
file = cur_file;
|
||||
is_cur_file = 1;
|
||||
}
|
||||
else if (!lstrcmpiW(file, cur_file))
|
||||
{
|
||||
is_cur_file = 1;
|
||||
}
|
||||
|
||||
if (title && stat_disp.Length() > 0 && is_cur_file)
|
||||
{
|
||||
lstrcpynW(title, stat_disp, 256);
|
||||
title = 0;
|
||||
}
|
||||
|
||||
if (!len && !title) return ;
|
||||
|
||||
if (is_cur_file)
|
||||
{
|
||||
EnterCriticalSection(&sync);
|
||||
if (theFile)
|
||||
{
|
||||
vf = theFile;
|
||||
is_vf_local = 0;
|
||||
}
|
||||
else
|
||||
LeaveCriticalSection(&sync);
|
||||
}
|
||||
|
||||
if (!vf)
|
||||
{
|
||||
vf = VorbisFile::Create(file, 1);
|
||||
if (!vf)
|
||||
{
|
||||
if (title)
|
||||
{
|
||||
lstrcpynW(title, PathFindFileNameW(file), 256);
|
||||
wchar_t *blah = PathFindExtensionW(title);
|
||||
*blah=0;
|
||||
}
|
||||
return ;
|
||||
}
|
||||
}
|
||||
|
||||
if (len)
|
||||
{
|
||||
*len = (int)(vf->Length() * 1000);
|
||||
}
|
||||
|
||||
if (title)
|
||||
{
|
||||
const char *t = vf->get_meta("ARTIST", 0);
|
||||
if (t)
|
||||
{
|
||||
MultiByteToWideCharSZ(CP_UTF8, 0, t, -1, title, 256);
|
||||
t = vf->get_meta("TITLE", 0);
|
||||
if (t)
|
||||
{
|
||||
StringCchCatW(title, 256, L" - ");
|
||||
StringCchCatW(title, 256, AutoWide(t, CP_UTF8));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *t = vf->get_meta("TITLE", 0);
|
||||
if (t)
|
||||
MultiByteToWideCharSZ(CP_UTF8, 0, t, -1, title, 256);
|
||||
else
|
||||
{
|
||||
lstrcpynW(title, PathFindFileNameW(file), 256);
|
||||
wchar_t *blah = PathFindExtensionW(title);
|
||||
*blah=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
//q:
|
||||
if (is_vf_local)
|
||||
delete vf;
|
||||
else
|
||||
LeaveCriticalSection(&sync);
|
||||
}
|
||||
|
||||
void w9x_itow(wchar_t *dest, int value, int destlen)
|
||||
{
|
||||
StringCchPrintfW(dest, destlen, L"%d", value);
|
||||
|
||||
}
|
||||
void w9x_utow(wchar_t *dest, int value, int destlen)
|
||||
{
|
||||
StringCchPrintfW(dest, destlen, L"%u", value);
|
||||
}
|
||||
void w9x_htow(wchar_t *dest, int value, int destlen)
|
||||
{
|
||||
StringCchPrintfW(dest, destlen, L"%08x", value);
|
||||
}
|
||||
|
||||
static void print_misc(VorbisFile * _vf,int link,wchar_t * out, int outlen)
|
||||
{
|
||||
OggVorbis_File * vf=&_vf->vf;
|
||||
double t=ov_time_total(vf,link);
|
||||
vorbis_info * vi=ov_info(vf,link);
|
||||
vorbis_comment * vc=ov_comment(vf,link);
|
||||
if (!vi || !vc) {WASABI_API_LNGSTRINGW_BUF(IDS_FILE_ERROR,out,outlen);return;}
|
||||
|
||||
wchar_t kbps_str[16] = {0};
|
||||
WASABI_API_LNGSTRINGW_BUF(IDS_KBPS, kbps_str, 16);
|
||||
|
||||
wchar_t length[48]=L"", avgbitrate[48]=L"", filesize[48]=L"", nombitrate[48]=L"", maxbitrate[48]=L"", minbitrate[48]=L"";
|
||||
if (t>0)
|
||||
{
|
||||
int h = (int)(t/3600.0);
|
||||
int m = (int)(t/60.0)%60;
|
||||
int s = (int)t%60;
|
||||
|
||||
if(h>0) StringCchPrintfW(length,48,L"%s%u:%02u:%02u\r\n",WASABI_API_LNGSTRINGW(IDS_LENGTH),h,m,s);
|
||||
else if(m>0) StringCchPrintfW(length,48,L"%s%u:%02u\r\n",WASABI_API_LNGSTRINGW(IDS_LENGTH),m,s);
|
||||
else if(s>0) StringCchPrintfW(length,48,L"%s%u\r\n",WASABI_API_LNGSTRINGW(IDS_LENGTH),s);
|
||||
|
||||
UINT fs=_vf->FileSize();
|
||||
if (fs>0)
|
||||
{
|
||||
int kbps = (int)(((double)fs)/(t*125.0));
|
||||
wchar_t tmp[32] = {0};
|
||||
StringCchPrintfW(avgbitrate,48,L"%s%u %s\r\n",WASABI_API_LNGSTRINGW(IDS_AVERAGE_BITRATE),kbps,kbps_str);
|
||||
|
||||
int fs1=fs/1000000;
|
||||
int fs2=(fs/1000)%1000;
|
||||
int fs3=fs%1000;
|
||||
if(fs1)
|
||||
StringCchPrintfW(filesize,48,L"%s%u%03u%03u %s\r\n",WASABI_API_LNGSTRINGW(IDS_FILE_SIZE),fs1,fs2,fs3,WASABI_API_LNGSTRINGW_BUF(IDS_BYTES,tmp,32));
|
||||
else if(fs2)
|
||||
StringCchPrintfW(filesize,48,L"%s%u%03u %s\r\n",WASABI_API_LNGSTRINGW(IDS_FILE_SIZE),fs2,fs3,WASABI_API_LNGSTRINGW_BUF(IDS_BYTES,tmp,32));
|
||||
else
|
||||
StringCchPrintfW(filesize,48,L"%s%u %s\r\n",WASABI_API_LNGSTRINGW(IDS_FILE_SIZE),fs3,WASABI_API_LNGSTRINGW_BUF(IDS_BYTES,tmp,32));
|
||||
}
|
||||
}
|
||||
|
||||
if (vi->bitrate_nominal>0)
|
||||
StringCchPrintfW(nombitrate,48,L"%s%u %s\r\n",WASABI_API_LNGSTRINGW(IDS_NOMINAL_BITRATE),vi->bitrate_nominal/1000,kbps_str);
|
||||
|
||||
if (vi->bitrate_lower>0)
|
||||
StringCchPrintfW(minbitrate,48,L"%s%u %s\r\n",WASABI_API_LNGSTRINGW(IDS_MIN_BITRATE),vi->bitrate_lower/1000,kbps_str);
|
||||
|
||||
if (vi->bitrate_nominal>0)
|
||||
StringCchPrintfW(maxbitrate,48,L"%s%u %s\r\n",WASABI_API_LNGSTRINGW(IDS_MAX_BITRATE),vi->bitrate_nominal/1000,kbps_str);
|
||||
|
||||
wchar_t tmp[32] = {0}, tmp2[32] = {0}, tmp3[32] = {0}, tmp4[32] = {0}, tmp5[32] = {0}, hzStr[8] = {0};
|
||||
StringCchPrintfW(out,outlen,L"%s%s%s%s%s%s%s: %u\r\n%s: %u %s\r\n%s: %u\r\n%s: %u\r\n%s: \r\n%s",
|
||||
length, avgbitrate, filesize, nombitrate, maxbitrate, minbitrate,
|
||||
WASABI_API_LNGSTRINGW_BUF(IDS_CHANNELS,tmp,32),vi->channels,
|
||||
WASABI_API_LNGSTRINGW_BUF(IDS_SAMPLING_RATE,tmp2,32),vi->rate, WASABI_API_LNGSTRINGW_BUF(IDS_HZ,hzStr,8),
|
||||
WASABI_API_LNGSTRINGW_BUF(IDS_SERIAL_NUMBER,tmp3,32),ov_serialnumber(vf,link),
|
||||
WASABI_API_LNGSTRINGW_BUF(IDS_VERSION,tmp4,32),vi->version,
|
||||
WASABI_API_LNGSTRINGW_BUF(IDS_VENDOR,tmp5,32),(wchar_t*)AutoWide(vc->vendor,CP_UTF8));
|
||||
}
|
||||
|
||||
static VorbisFile* last_vf = 0;
|
||||
static wchar_t last_file[MAX_PATH] = {0};
|
||||
static FILETIME ftLastWriteTime;
|
||||
|
||||
// is used to determine if the last write time of the file has changed when
|
||||
// asked to get the metadata for the same cached file so we can update things
|
||||
BOOL HasFileTimeChanged(const wchar_t *fn)
|
||||
{
|
||||
WIN32_FILE_ATTRIBUTE_DATA fileData = {0};
|
||||
if (GetFileAttributesExW(fn, GetFileExInfoStandard, &fileData) == TRUE)
|
||||
{
|
||||
if(CompareFileTime(&ftLastWriteTime, &fileData.ftLastWriteTime))
|
||||
{
|
||||
ftLastWriteTime = fileData.ftLastWriteTime;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void UpdateFileTimeChanged(const wchar_t *fn)
|
||||
{
|
||||
WIN32_FILE_ATTRIBUTE_DATA fileData;
|
||||
if (GetFileAttributesExW(fn, GetFileExInfoStandard, &fileData) == TRUE)
|
||||
{
|
||||
ftLastWriteTime = fileData.ftLastWriteTime;
|
||||
}
|
||||
}
|
||||
|
||||
// need to call this when we shut down just to make sure things are correctly cleaned up
|
||||
//(the joys of caching for speed)
|
||||
void winampGetExtendedFileInfoW_Cleanup(void)
|
||||
{
|
||||
if (last_vf)
|
||||
{
|
||||
delete last_vf;
|
||||
last_vf = 0;
|
||||
}
|
||||
last_file[0] = 0;
|
||||
}
|
||||
|
||||
static void CALLBACK winampGetExtendedFileInfoW_Timer(HWND hwnd, UINT uMsg, UINT_PTR eventId, DWORD elapsed)
|
||||
{
|
||||
// TODO need to do a better way of getting and caching the metadata
|
||||
// this is _just_ a temp fix for the file being locked when it
|
||||
// it really needs 'class Info' to be able to cache and read.
|
||||
KillTimer(hwnd, eventId);
|
||||
winampGetExtendedFileInfoW_Cleanup();
|
||||
}
|
||||
|
||||
bool KeywordMatch(const char *mainString, const char *keyword)
|
||||
{
|
||||
return !_stricmp(mainString, keyword);
|
||||
}
|
||||
|
||||
#define START_TAG_ALIAS(name, alias) if (KeywordMatch(data, name)) lookup=alias
|
||||
#define TAG_ALIAS(name, alias) else if (KeywordMatch(data, name)) lookup=alias
|
||||
extern "C" __declspec( dllexport ) int winampGetExtendedFileInfoW(const wchar_t *fn, const char *data, wchar_t *dest, int destlen)
|
||||
{
|
||||
if (!_stricmp(data, "type"))
|
||||
{
|
||||
dest[0] = '0';
|
||||
dest[1] = 0;
|
||||
return 1;
|
||||
}
|
||||
else if (!_stricmp(data, "rateable"))
|
||||
{
|
||||
dest[0] = '1';
|
||||
dest[1] = 0;
|
||||
return 1;
|
||||
}
|
||||
else if (!_stricmp(data, "streammetadata"))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!fn || (fn && !fn[0])) return 0;
|
||||
|
||||
if (!_stricmp(data, "family"))
|
||||
{
|
||||
LPCWSTR e;
|
||||
int pID = -1;
|
||||
DWORD lcid;
|
||||
e = PathFindExtensionW(fn);
|
||||
if (L'.' != *e) return 0;
|
||||
e++;
|
||||
lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
|
||||
if (CSTR_EQUAL == CompareStringW(lcid, NORM_IGNORECASE, e, -1, L"OGG", -1) ||
|
||||
CSTR_EQUAL == CompareStringW(lcid, NORM_IGNORECASE, e, -1, L"OGA", -1)) pID = IDS_FAMILY_STRING;
|
||||
if (pID != -1 && S_OK == StringCchCopyW(dest, destlen, WASABI_API_LNGSTRINGW(pID))) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!_stricmp(data, "mime"))
|
||||
{
|
||||
StringCchCopyW(dest, destlen, L"audio/ogg");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// attempt to cache/use a cached instance of VorbisFile to speed up metadata queries
|
||||
// which is especially needed with large ogg files (like with a 4Mb embedded image!)
|
||||
VorbisFile* vf = 0;
|
||||
if(last_file[0] && !_wcsicmp(last_file, fn) && !HasFileTimeChanged(fn))
|
||||
{
|
||||
vf = last_vf;
|
||||
}
|
||||
else
|
||||
{
|
||||
// different file so clean up if there's a cached instance
|
||||
if(last_vf)
|
||||
{
|
||||
delete last_vf;
|
||||
last_vf = 0;
|
||||
}
|
||||
// open the new file and cache the current filename for subsequent query checks
|
||||
vf = VorbisFile::Create(fn, 1);
|
||||
lstrcpynW(last_file, fn, MAX_PATH);
|
||||
}
|
||||
|
||||
if (!vf) return 0;
|
||||
else last_vf = vf;
|
||||
|
||||
// TODO need to do a better way of getting and caching the metadata
|
||||
// this is _just_ a temp fix for the file being locked when it
|
||||
// it really needs 'class Info' to be able to cache and read.
|
||||
SetTimer(mod.hMainWindow, 256, 2000, winampGetExtendedFileInfoW_Timer);
|
||||
|
||||
const char *lookup = 0;
|
||||
if (!_stricmp(data, "length"))
|
||||
{
|
||||
int len = (int)(vf->Length() * 1000);
|
||||
w9x_itow(dest, len, destlen);
|
||||
return 1;
|
||||
}
|
||||
else if (!_stricmp(data, "bitrate"))
|
||||
{
|
||||
int br = vf->get_avg_bitrate();
|
||||
w9x_itow(dest, br, destlen);
|
||||
return 1;
|
||||
}
|
||||
else if (!_stricmp(data, "SERIALNUMBER"))
|
||||
{
|
||||
w9x_utow(dest, ov_serialnumber(&vf->vf, -1), destlen);
|
||||
return 1;
|
||||
}
|
||||
else if (!_stricmp(data, "SERIALNUMBER_HEX"))
|
||||
{
|
||||
w9x_htow(dest, ov_serialnumber(&vf->vf, -1), destlen);
|
||||
return 1;
|
||||
}
|
||||
else if (!_stricmp(data, "gain"))
|
||||
{
|
||||
float gain = 20.0f*(float)log10(vf->GetGain());
|
||||
StringCchPrintfW(dest, destlen, L"%-+.2f dB", gain);
|
||||
return 1;
|
||||
}
|
||||
else if(!_stricmp(data,"formatinformation"))
|
||||
{
|
||||
print_misc(vf,0,dest,destlen);
|
||||
return 1;
|
||||
}
|
||||
TAG_ALIAS("title", "TITLE");
|
||||
TAG_ALIAS("artist", "ARTIST");
|
||||
TAG_ALIAS("album", "ALBUM");
|
||||
TAG_ALIAS("genre", "GENRE");
|
||||
TAG_ALIAS("comment", "COMMENT");
|
||||
TAG_ALIAS("year", "DATE");
|
||||
TAG_ALIAS("track", "TRACKNUMBER");
|
||||
TAG_ALIAS("albumartist", "ALBUMARTIST");
|
||||
TAG_ALIAS("composer", "COMPOSER");
|
||||
TAG_ALIAS("disc", "DISCNUMBER");
|
||||
TAG_ALIAS("publisher", "PUBLISHER");
|
||||
TAG_ALIAS("conductor", "CONDUCTOR");
|
||||
TAG_ALIAS("tool", "ENCODED-BY");
|
||||
TAG_ALIAS("replaygain_track_gain", "REPLAYGAIN_TRACK_GAIN");
|
||||
TAG_ALIAS("replaygain_track_peak", "REPLAYGAIN_TRACK_PEAK");
|
||||
TAG_ALIAS("replaygain_album_gain", "REPLAYGAIN_ALBUM_GAIN");
|
||||
TAG_ALIAS("replaygain_album_peak", "REPLAYGAIN_ALBUM_PEAK");
|
||||
TAG_ALIAS("GracenoteFileID", "GRACENOTEFILEID");
|
||||
TAG_ALIAS("GracenoteExtData", "GRACENOTEEXTDATA");
|
||||
TAG_ALIAS("bpm", "BPM");
|
||||
TAG_ALIAS("remixing", "REMIXING");
|
||||
TAG_ALIAS("subtitle", "VERSION");
|
||||
TAG_ALIAS("isrc", "ISRC");
|
||||
TAG_ALIAS("category", "CATEGORY");
|
||||
TAG_ALIAS("rating", "RATING");
|
||||
TAG_ALIAS("producer", "PRODUCER");
|
||||
|
||||
if (!lookup)
|
||||
return 0;
|
||||
|
||||
const char *value = vf->get_meta(lookup, 0);
|
||||
|
||||
if(KeywordMatch("comment",data)) {
|
||||
if(!value || !*value) value = vf->get_meta("DESCRIPTION", 0);
|
||||
}
|
||||
|
||||
if(KeywordMatch("year",data)) {
|
||||
if(!value || !*value) value = vf->get_meta("YEAR", 0);
|
||||
}
|
||||
|
||||
if(KeywordMatch("track",data)) {
|
||||
if(!value || !*value) value = vf->get_meta("TRACK", 0);
|
||||
}
|
||||
|
||||
if(KeywordMatch("albumartist",data)) {
|
||||
if(!value || !*value) value = vf->get_meta("ALBUM ARTIST", 0);
|
||||
if(!value || !*value) value = vf->get_meta("ENSEMBLE", 0);
|
||||
}
|
||||
|
||||
if(KeywordMatch("publisher",data)) {
|
||||
if(!value || !*value) value = vf->get_meta("ORGANIZATION", 0);
|
||||
}
|
||||
|
||||
if(KeywordMatch("category",data)) {
|
||||
if(!value || !*value) value = vf->get_meta("CONTENTGROUP", 0);
|
||||
if(!value || !*value) value = vf->get_meta("GROUPING", 0);
|
||||
}
|
||||
|
||||
if(KeywordMatch(data, "rating")) {
|
||||
if(!value || !*value) value = vf->get_meta("RATING", 0);
|
||||
if(value && *value) {
|
||||
int rating = atoi(value);
|
||||
// keeps things limited to our range of 0-100
|
||||
if (rating >= 100) {
|
||||
rating = 5;
|
||||
}
|
||||
// 1-100 case
|
||||
else if (rating > 5 && rating < 100) {
|
||||
rating /= 20;
|
||||
// shift up by one rating when in next band
|
||||
// 1-20 = 1, 21-40 = 2, 41-60 = 3, 61-80 = 4, 81-100 = 5
|
||||
rating += ((atoi(value) - (rating * 20)) > 0);
|
||||
}
|
||||
// Remove support for old 1-10 range
|
||||
/* or maybe we're dealing with a 1-10 range
|
||||
else if (rating > 5) {
|
||||
rating /= 2;
|
||||
} */
|
||||
|
||||
// otherwise it is hopefully in the 0-5 range
|
||||
else if (rating > 0 && rating <= 5) {
|
||||
}
|
||||
// otherwise just make sure and set zero
|
||||
else {
|
||||
rating = 0;
|
||||
}
|
||||
|
||||
StringCchPrintfW(dest, destlen, L"%u", rating);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if(value)
|
||||
MultiByteToWideCharSZ(CP_UTF8, 0, value, -1, dest, destlen);
|
||||
else
|
||||
{
|
||||
dest[0]=0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
@@ -1,260 +0,0 @@
|
||||
#include "main.h"
|
||||
#include "../nu/AutoChar.h"
|
||||
|
||||
extern CfgInt cfg_fullbuf;
|
||||
|
||||
int VorbisFile::_f_close(void *) {return 0;}
|
||||
|
||||
int VorbisFile::_f_seek(void* rs,__int64 offset,int whence)
|
||||
{
|
||||
return ((VorbisFile*)rs)->f_seek(offset,whence);
|
||||
}
|
||||
|
||||
size_t VorbisFile::_f_read(void* ptr,size_t size,size_t nmemb,void * rs)
|
||||
{
|
||||
return ((VorbisFile*)rs)->f_read((UINT)(size*nmemb),ptr);
|
||||
}
|
||||
|
||||
long VorbisFile::_f_tell(void* rs)
|
||||
{
|
||||
return ((VorbisFile*)rs)->f_tell();
|
||||
}
|
||||
|
||||
ov_callbacks VorbisFile::oc={_f_read,_f_seek,_f_close,_f_tell};
|
||||
|
||||
static __int64 Seek64(HANDLE hf, __int64 distance, DWORD MoveMethod)
|
||||
{
|
||||
LARGE_INTEGER li;
|
||||
|
||||
li.QuadPart = distance;
|
||||
|
||||
li.LowPart = SetFilePointer (hf, li.LowPart, &li.HighPart, MoveMethod);
|
||||
|
||||
if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR)
|
||||
{
|
||||
li.QuadPart = -1;
|
||||
}
|
||||
|
||||
return li.QuadPart;
|
||||
}
|
||||
|
||||
static __int64 FileSize64(HANDLE file)
|
||||
{
|
||||
LARGE_INTEGER position;
|
||||
position.QuadPart=0;
|
||||
position.LowPart = GetFileSize(file, (LPDWORD)&position.HighPart);
|
||||
|
||||
if (position.LowPart == INVALID_FILE_SIZE && GetLastError() != NO_ERROR)
|
||||
return INVALID_FILE_SIZE;
|
||||
else
|
||||
return position.QuadPart;
|
||||
}
|
||||
|
||||
class VorbisFile_Local : public VorbisFile
|
||||
{
|
||||
private:
|
||||
HANDLE hFile;
|
||||
protected:
|
||||
int f_seek(__int64 offset,int whence)
|
||||
{
|
||||
if(whence==SEEK_SET) offset+=baseoffs;
|
||||
if (Seek64(hFile,offset,whence) != INVALID_SET_FILE_POINTER) return 0;
|
||||
else return -1;
|
||||
}
|
||||
|
||||
size_t f_read(UINT siz,void * ptr)
|
||||
{
|
||||
DWORD bw=0;
|
||||
ReadFile(hFile,ptr,siz,&bw,0);
|
||||
return bw;
|
||||
}
|
||||
|
||||
UINT f_tell()
|
||||
{
|
||||
return (UINT)(SetFilePointer(hFile,0,0,FILE_CURRENT)-baseoffs);
|
||||
}
|
||||
|
||||
UINT FileSize()
|
||||
{
|
||||
return (UINT)(FileSize64(hFile)-baseoffs);
|
||||
}
|
||||
|
||||
public:
|
||||
virtual int GetType() {return TYPE_LOCAL;}
|
||||
VorbisFile_Local(HANDLE f,const wchar_t * u,bool is_info) : VorbisFile(u,is_info) {hFile=f;}
|
||||
~VorbisFile_Local() {CloseHandle(hFile);}
|
||||
};
|
||||
|
||||
class VorbisFile_Mem : public VorbisFile
|
||||
{
|
||||
BYTE * block;
|
||||
UINT size,ptr;
|
||||
protected:
|
||||
int f_seek(__int64 offset,int whence)
|
||||
{
|
||||
switch(whence)
|
||||
{
|
||||
case SEEK_SET:
|
||||
ptr=(UINT)(offset+baseoffs);
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
ptr+=(UINT)offset;
|
||||
break;
|
||||
case SEEK_END:
|
||||
ptr=size+whence;
|
||||
break;
|
||||
}
|
||||
if (ptr<=size) return 0;
|
||||
else {ptr=size;return -1;}
|
||||
}
|
||||
|
||||
size_t f_read(UINT siz,void * out)
|
||||
{
|
||||
UINT d=size-ptr;
|
||||
if (d>siz) d=siz;
|
||||
memcpy(out,block+ptr,d);
|
||||
ptr+=d;
|
||||
return d;
|
||||
}
|
||||
|
||||
UINT f_tell()
|
||||
{
|
||||
return (UINT)(ptr-baseoffs);
|
||||
}
|
||||
|
||||
UINT FileSize()
|
||||
{
|
||||
return (UINT)(size-baseoffs);
|
||||
}
|
||||
|
||||
public:
|
||||
virtual int GetType() {return TYPE_LOCAL;}
|
||||
|
||||
VorbisFile_Mem(HANDLE f,const wchar_t * u,bool is_info) : VorbisFile(u,is_info)
|
||||
{
|
||||
size=GetFileSize(f,0);
|
||||
ptr=0;
|
||||
block=(BYTE*)malloc(size);
|
||||
DWORD br = 0;
|
||||
ReadFile(f,block,size,&br,0);
|
||||
CloseHandle(f);
|
||||
}
|
||||
|
||||
~VorbisFile_Mem() {free(block);}
|
||||
};
|
||||
|
||||
VorbisFile * VorbisFile::Create(const wchar_t *url, bool is_info)
|
||||
{
|
||||
VorbisFile * r;
|
||||
if (PathIsURLW(url))
|
||||
{
|
||||
if (is_info) return 0;
|
||||
r=Create_HTTP(AutoChar(url),is_info);
|
||||
}
|
||||
else
|
||||
{
|
||||
__int64 baseoffs=0;
|
||||
HANDLE f=CreateFileW(url,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
|
||||
if (f==INVALID_HANDLE_VALUE) return 0;
|
||||
{
|
||||
DWORD dw = 0, br = 0;
|
||||
ReadFile(f,&dw,4,&br,0);
|
||||
if(br==4 && dw=='SggO')
|
||||
{
|
||||
SetFilePointer(f,0,0,FILE_BEGIN);
|
||||
}
|
||||
else if(br==4 && dw=='FFIR')
|
||||
{
|
||||
//RIFF file
|
||||
DWORD wavhdr = 0, nb = 0;
|
||||
SetFilePointer(f,4,0,FILE_CURRENT);
|
||||
ReadFile(f,&wavhdr,4,&nb,0);
|
||||
if(nb!=4 || wavhdr!='EVAW')
|
||||
{
|
||||
goto abort;
|
||||
}
|
||||
|
||||
//find data starting point
|
||||
char tmp[1024] = {0};
|
||||
ReadFile(f,&tmp,1024,&nb,0);
|
||||
for(int i=0;i<1020;i++)
|
||||
if(tmp[i]=='d'&&tmp[i+1]=='a'&&tmp[i+2]=='t'&&tmp[i+3]=='a')
|
||||
{
|
||||
baseoffs=i+12+8;
|
||||
Seek64(f, baseoffs, FILE_BEGIN);
|
||||
}
|
||||
|
||||
if(!baseoffs) goto abort;
|
||||
}
|
||||
else
|
||||
{
|
||||
abort:
|
||||
CloseHandle(f);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
r=cfg_fullbuf ? (VorbisFile*)new VorbisFile_Mem(f,url,is_info) : (VorbisFile*)new VorbisFile_Local(f,url,is_info);
|
||||
r->setBaseOffset(baseoffs);
|
||||
}
|
||||
if (r && !r->init())
|
||||
{
|
||||
delete r;
|
||||
r=0;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
bool VorbisFile::init()
|
||||
{
|
||||
if (ov_open_callbacks(this,&vf,0,0,oc)) return 0;
|
||||
//TODO bitrate
|
||||
UINT siz=FileSize();
|
||||
double len=Length();
|
||||
if (siz>0 && len>0)
|
||||
{
|
||||
UINT divisor = (UINT)(len*125.0);
|
||||
if (divisor)
|
||||
avg_kbps=siz/divisor;
|
||||
}
|
||||
|
||||
post_init();
|
||||
return 1;
|
||||
}
|
||||
|
||||
int is_http(const char* url)
|
||||
{
|
||||
return (!_strnicmp(url,"http://",7) || !_strnicmp(url,"https://",8));
|
||||
}
|
||||
|
||||
void VorbisFile::set_meta(const vorbis_comment * vc,int links)
|
||||
{
|
||||
if (links == vf.links)
|
||||
{
|
||||
int n;
|
||||
for(n=0;n<links;n++)
|
||||
{
|
||||
vorbis_comment_clear(vf.vc+n);
|
||||
/*
|
||||
extern void vorbis_comment_init(vorbis_comment *vc);
|
||||
extern void vorbis_comment_add(vorbis_comment *vc, char *comment);
|
||||
extern void vorbis_comment_add_tag(vorbis_comment *vc,char *tag, char *contents);
|
||||
extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count);
|
||||
extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag);
|
||||
extern void vorbis_comment_clear(vorbis_comment *vc);
|
||||
*/
|
||||
}
|
||||
_ogg_free(vf.vc);
|
||||
vf.vc = (vorbis_comment*) _ogg_calloc(links,sizeof(vorbis_comment));
|
||||
for(n=0;n<links;n++)
|
||||
{
|
||||
vorbis_comment_init(vf.vc+n);
|
||||
int c;
|
||||
for(c=0;c<vc[n].comments;c++)
|
||||
{
|
||||
vorbis_comment_add(vf.vc+n,vc[n].user_comments[c]);
|
||||
}
|
||||
vf.vc[n].vendor = _strdup(vc[n].vendor);
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,220 +0,0 @@
|
||||
#ifndef IN_VORBIS_MAIN_H
|
||||
#define IN_VORBIS_MAIN_H
|
||||
|
||||
#define WINSOCK_API_LINKAGE
|
||||
|
||||
#ifndef STRICT
|
||||
#define STRICT
|
||||
#endif
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
extern int (*warand)();
|
||||
extern float (*warandf)();
|
||||
|
||||
inline void * z_malloc(int x)
|
||||
{
|
||||
void* foo=malloc(x);
|
||||
if (foo) memset(foo,0,x);
|
||||
return foo;
|
||||
}
|
||||
#include <shlwapi.h>
|
||||
#include <malloc.h>
|
||||
#define uitoa(x,y) _itoa(x,y,10)
|
||||
#define atoui atoi
|
||||
|
||||
#include <vorbis\vorbisfile.h>
|
||||
#include "c_string.h"
|
||||
#include "../Winamp/in2.h"
|
||||
|
||||
extern In_Module mod;
|
||||
|
||||
#include "resource.h"
|
||||
|
||||
#define VER L"1.79"
|
||||
#define _NAME "Nullsoft Vorbis Decoder"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
extern const char *INI_FILE;
|
||||
extern const wchar_t *INI_DIRECTORY;
|
||||
}
|
||||
class CfgVar
|
||||
{
|
||||
private:
|
||||
String name;
|
||||
CfgVar * next;
|
||||
static CfgVar * list;
|
||||
public:
|
||||
|
||||
static void ReadConfig();
|
||||
static void WriteConfig();
|
||||
|
||||
//helpers
|
||||
static bool read_struct(const char *inifile, const char *section, const char * name,void * ptr,UINT size);
|
||||
static void write_struct(const char *inifile, const char *section, const char * name,void * ptr,UINT size);
|
||||
static void write_int(const char *inifile, const char *section, const char * name,int val);
|
||||
static int read_int(const char *inifile, const char *section,const char * name,int def);
|
||||
|
||||
protected:
|
||||
CfgVar(const char * n) : name(n) {next=list;list=this;}
|
||||
virtual void Read(const char * name)=0;
|
||||
virtual void Write(const char * name)=0;
|
||||
};
|
||||
|
||||
class CfgInt : private CfgVar
|
||||
{
|
||||
private:
|
||||
int def,value;
|
||||
public:
|
||||
CfgInt(const char * name,int _def) : CfgVar(name) {value=def=_def;}
|
||||
inline int operator=(int x) {value=x;return value;}
|
||||
inline operator int() {return value;}
|
||||
private:
|
||||
virtual void Read(const char * name);
|
||||
virtual void Write(const char * name);
|
||||
};
|
||||
|
||||
class CfgString : private CfgVar, public StringW
|
||||
{
|
||||
private:
|
||||
StringW def;
|
||||
public:
|
||||
CfgString(const char * name,const char * _def) : CfgVar(name), StringW(_def), def(_def) {}
|
||||
private:
|
||||
virtual void Read(const char * name);
|
||||
virtual void Write(const char * name);
|
||||
};
|
||||
|
||||
template<class T>
|
||||
class CfgStructT : private CfgVar
|
||||
{
|
||||
public:
|
||||
T data;
|
||||
CfgStructT(const char * name) : CfgVar(name) {}
|
||||
private:
|
||||
void Read(const char * name) { read_struct(INI_FILE, "in_vorbis",name,&data,sizeof(data));}
|
||||
void Write(const char * name) {if (IsValueDefault()) WritePrivateProfileStringA("in_vorbis", name, 0, INI_FILE); else write_struct(INI_FILE, "in_vorbis", name, &data, sizeof(data));}
|
||||
protected:
|
||||
virtual bool IsValueDefault() {return 0;}
|
||||
};
|
||||
|
||||
|
||||
class CfgFont : public CfgStructT<LOGFONT>
|
||||
{
|
||||
private:
|
||||
void get_def(LOGFONT * f) {memset(f,0,sizeof(LOGFONT));GetObject(GetStockObject(DEFAULT_GUI_FONT),sizeof(LOGFONT),f);}
|
||||
virtual bool IsValueDefault()
|
||||
{
|
||||
LOGFONT t;
|
||||
get_def(&t);
|
||||
return !memcmp(&data,&t,sizeof(LOGFONT));
|
||||
}
|
||||
public:
|
||||
CfgFont(const char * name) : CfgStructT<LOGFONT>(name)
|
||||
{
|
||||
get_def(&data);
|
||||
}
|
||||
};
|
||||
|
||||
extern int32_t priority_tab[7];
|
||||
extern HINSTANCE hIns;
|
||||
|
||||
extern CfgString cfg_ssave_format,cfg_dumpdir;
|
||||
|
||||
int is_http(const char* url);
|
||||
|
||||
class VorbisFile
|
||||
{
|
||||
protected:
|
||||
virtual int f_seek(__int64 offset,int whence)=0;
|
||||
virtual size_t f_read(UINT siz,void * ptr)=0;
|
||||
virtual UINT f_tell()=0;
|
||||
static int _f_close(void *);
|
||||
static int _f_seek(void* rs,__int64 offset,int whence);
|
||||
static size_t _f_read(void* ptr,size_t size,size_t nmemb,void * rs);
|
||||
static long _f_tell(void* rs);
|
||||
static ov_callbacks oc;
|
||||
static VorbisFile * Create_HTTP(const char * url,bool is_info);
|
||||
VorbisFile(const wchar_t * u, bool is_info) : url(u) {memset(&vf,0,sizeof(vf));stopping=0;abort_prebuf=0;avg_kbps=0;use_prebuf=0;primary=!is_info; baseoffs=0;}
|
||||
bool init();
|
||||
virtual void post_init() {};
|
||||
UINT avg_kbps;
|
||||
bool Aborting();
|
||||
|
||||
__int64 baseoffs;
|
||||
public:
|
||||
enum {TYPE_LOCAL,TYPE_HTTP};
|
||||
virtual int GetType()=0;
|
||||
virtual bool IsLive() {return 0;}
|
||||
virtual void do_prebuf() {use_prebuf=1;abort_prebuf=0;};
|
||||
StringW url;
|
||||
String withlp;
|
||||
String stream_title;
|
||||
bool stopping,abort_prebuf,use_prebuf;
|
||||
bool primary;//display status messages or not
|
||||
OggVorbis_File vf;
|
||||
UINT get_avg_bitrate()
|
||||
{
|
||||
if (avg_kbps>0) return avg_kbps;
|
||||
vorbis_info * vi=ov_info(&vf,-1);
|
||||
if (!vi) return 0;
|
||||
return vi->bitrate_nominal/1000;
|
||||
}
|
||||
|
||||
const char* get_meta(const char* tag,UINT c);
|
||||
void set_meta(const vorbis_comment * vc,int links);
|
||||
|
||||
static VorbisFile * Create(const wchar_t * url,bool is_info);
|
||||
|
||||
double Length() {return ov_time_total(&vf,-1);}
|
||||
double GetPos() {return ov_time_tell(&vf);}
|
||||
int Seek(double p);
|
||||
void Status(const wchar_t * zzz);
|
||||
virtual UINT FileSize()=0;
|
||||
|
||||
virtual ~VorbisFile() {ov_clear(&vf);}
|
||||
virtual void Idle() {Sleep(10);}
|
||||
|
||||
virtual void setBaseOffset(__int64 offs) { baseoffs=offs; }
|
||||
|
||||
float GetGain();
|
||||
};
|
||||
|
||||
extern VorbisFile * theFile;
|
||||
|
||||
extern StringW cur_file;
|
||||
|
||||
extern CRITICAL_SECTION sync;
|
||||
|
||||
BOOL modify_file(const wchar_t* url,const vorbis_comment * comments,int links);
|
||||
void winampGetExtendedFileInfoW_Cleanup(void);
|
||||
void UpdateFileTimeChanged(const wchar_t *fn);
|
||||
void do_cfg(int s);
|
||||
bool KeywordMatch(const char *mainString, const char *keyword);
|
||||
|
||||
class Info
|
||||
{
|
||||
public:
|
||||
Info(const wchar_t *filename);
|
||||
~Info();
|
||||
bool Save();
|
||||
int Error() { return vc==0?1:0; }
|
||||
int GetNumMetadataItems();
|
||||
void EnumMetadata(int n,wchar_t *key,int keylen, wchar_t *val, int vallen);
|
||||
void RemoveMetadata(wchar_t * key);
|
||||
void RemoveMetadata(int n);
|
||||
void SetMetadata(wchar_t *key, wchar_t *val);
|
||||
void SetMetadata(int n, wchar_t *key, wchar_t *val);
|
||||
void SetTag(int n,wchar_t *key); // changes the key name
|
||||
private:
|
||||
const wchar_t *filename;
|
||||
vorbis_comment * vc;
|
||||
int numstreams, stream;
|
||||
};
|
||||
|
||||
// {B6CB4A7C-A8D0-4c55-8E60-9F7A7A23DA0F}
|
||||
static const GUID playbackConfigGroupGUID =
|
||||
{ 0xb6cb4a7c, 0xa8d0, 0x4c55, { 0x8e, 0x60, 0x9f, 0x7a, 0x7a, 0x23, 0xda, 0xf } };
|
||||
|
||||
#endif //IN_VORBIS_MAIN_H
|
@@ -1,194 +0,0 @@
|
||||
#include "mkv_vorbis_decoder.h"
|
||||
#include "../nsmkv/Lacing.h"
|
||||
#include "../nsmkv/Cluster.h"
|
||||
#include <math.h>
|
||||
|
||||
|
||||
int MKVDecoderCreator::CreateAudioDecoder(const char *codec_id,
|
||||
const nsmkv::TrackEntryData *track_entry_data, const nsmkv::AudioData *audio_data,
|
||||
unsigned int preferred_bits, unsigned int max_channels, bool floating_point,
|
||||
ifc_mkvaudiodecoder **decoder)
|
||||
{
|
||||
if (!strcmp(codec_id, "A_VORBIS"))
|
||||
{
|
||||
MKVVorbis *vorbis = new MKVVorbis;
|
||||
vorbis_info_init(&vorbis->info);
|
||||
vorbis_comment_init(&vorbis->comment);
|
||||
nsmkv::LacingState lacing_state;
|
||||
if (nsmkv::Lacing::GetState(nsmkv::BlockBinary::XIPH_LACING, (const uint8_t *)track_entry_data->codec_private, track_entry_data->codec_private_len, &lacing_state))
|
||||
{
|
||||
const uint8_t *frame;
|
||||
size_t frame_len;
|
||||
uint16_t frame_number=0;
|
||||
while (nsmkv::Lacing::GetFrame(frame_number, (const uint8_t *)track_entry_data->codec_private, track_entry_data->codec_private_len, &frame, &frame_len, &lacing_state))
|
||||
{
|
||||
ogg_packet packet = {const_cast<uint8_t *>(frame), (long)frame_len, (frame_number==0), 0, 0 /*-1?*/, vorbis->packet_number++};
|
||||
int ret = vorbis_synthesis_headerin(&vorbis->info, &vorbis->comment, &packet);
|
||||
if (ret != 0)
|
||||
goto bail;
|
||||
frame_number++;
|
||||
}
|
||||
if (vorbis_synthesis_init(&vorbis->dsp, &vorbis->info) == 0
|
||||
&& vorbis_block_init(&vorbis->dsp, &vorbis->block) == 0)
|
||||
{
|
||||
vorbis->bps = preferred_bits?preferred_bits:16;
|
||||
*decoder = vorbis;
|
||||
return CREATEDECODER_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
bail:
|
||||
delete vorbis;
|
||||
return CREATEDECODER_FAILURE;
|
||||
}
|
||||
|
||||
return CREATEDECODER_NOT_MINE;
|
||||
}
|
||||
|
||||
|
||||
#define CBCLASS MKVDecoderCreator
|
||||
START_DISPATCH;
|
||||
CB(CREATE_AUDIO_DECODER, CreateAudioDecoder)
|
||||
END_DISPATCH;
|
||||
#undef CBCLASS
|
||||
|
||||
MKVVorbis::MKVVorbis()
|
||||
{
|
||||
bps=16;
|
||||
packet_number=0;
|
||||
}
|
||||
|
||||
#define PA_CLIP_( val, min, max )\
|
||||
{ val = ((val) < (min)) ? (min) : (((val) > (max)) ? (max) : (val)); }
|
||||
|
||||
#if defined(_M_IX86)
|
||||
static __inline long float_to_long(double t)
|
||||
{
|
||||
long r;
|
||||
__asm fld t
|
||||
__asm fistp r
|
||||
return r;
|
||||
}
|
||||
#else
|
||||
#define float_to_long(x) ((long)( x ))
|
||||
#endif
|
||||
|
||||
inline static void clip(double &x, double a, double b)
|
||||
{
|
||||
double x1 = fabs (x - a);
|
||||
double x2 = fabs (x - b);
|
||||
x = x1 + (a + b);
|
||||
x -= x2;
|
||||
x *= 0.5;
|
||||
}
|
||||
|
||||
static void Float32_To_Int24_Clip(void *destinationBuffer, void *sourceBuffer, size_t count, size_t channels, double gain)
|
||||
{
|
||||
float *src = (float*)sourceBuffer;
|
||||
unsigned char *dest = (unsigned char*)destinationBuffer;
|
||||
gain*=65536.*32768.;
|
||||
while ( count-- )
|
||||
{
|
||||
/* convert to 32 bit and drop the low 8 bits */
|
||||
double scaled = *src * gain;
|
||||
clip( scaled, -2147483648., 2147483647.);
|
||||
signed long temp = (signed long) scaled;
|
||||
|
||||
dest[0] = (unsigned char)(temp >> 8);
|
||||
dest[1] = (unsigned char)(temp >> 16);
|
||||
dest[2] = (unsigned char)(temp >> 24);
|
||||
|
||||
src++;
|
||||
dest += 3*channels;
|
||||
}
|
||||
}
|
||||
|
||||
static void Float32_To_Int16_Clip(void *destinationBuffer, void *sourceBuffer, size_t count, size_t channels, double gain)
|
||||
{
|
||||
float *src = (float*)sourceBuffer;
|
||||
signed short *dest = (signed short*)destinationBuffer;
|
||||
|
||||
gain*=32768.0;
|
||||
while ( count-- )
|
||||
{
|
||||
long samp = float_to_long((*src) * gain/* - 0.5*/);
|
||||
|
||||
PA_CLIP_( samp, -0x8000, 0x7FFF );
|
||||
*dest = (signed short) samp;
|
||||
|
||||
src ++;
|
||||
dest += channels;
|
||||
}
|
||||
}
|
||||
|
||||
int MKVVorbis::DecodeBlock(void *inputBuffer, size_t inputBufferBytes, void *outputBuffer, size_t *outputBufferBytes)
|
||||
{
|
||||
uint8_t *out = (uint8_t *)outputBuffer;
|
||||
ogg_packet packet = {(uint8_t *)inputBuffer, (long)inputBufferBytes, 0, 0, 0 -1, packet_number++};
|
||||
int ret = vorbis_synthesis(&block, &packet);
|
||||
if (ret == 0)
|
||||
{
|
||||
vorbis_synthesis_blockin(&dsp,&block);
|
||||
long channels = info.channels;
|
||||
float **pcm;
|
||||
int samples = vorbis_synthesis_pcmout(&dsp, &pcm);
|
||||
if (samples)
|
||||
{
|
||||
switch(bps)
|
||||
{
|
||||
case 16:
|
||||
for(int i=0;i<channels;i++)
|
||||
{
|
||||
Float32_To_Int16_Clip(out, pcm[i], samples, channels, 1.0 /*gain*/);
|
||||
out+=2;
|
||||
}
|
||||
break;
|
||||
case 24:
|
||||
for(int i=0;i<channels;i++)
|
||||
{
|
||||
Float32_To_Int24_Clip(out, pcm[i], samples, channels, 1.0 /*gain*/);
|
||||
out+=3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
*outputBufferBytes = samples*channels*bps/8;
|
||||
// let the decoder know we're processed them
|
||||
vorbis_synthesis_read(&dsp,samples);
|
||||
return MKV_SUCCESS;
|
||||
}
|
||||
return MKV_FAILURE;
|
||||
}
|
||||
|
||||
int MKVVorbis::GetOutputProperties(unsigned int *sampleRate, unsigned int *channels, unsigned int *bitsPerSample, bool *isFloat)
|
||||
{
|
||||
*sampleRate = info.rate;
|
||||
*channels = info.channels;
|
||||
*bitsPerSample = bps;
|
||||
*isFloat = false; // TODO
|
||||
return MKV_SUCCESS;
|
||||
}
|
||||
|
||||
void MKVVorbis::Flush()
|
||||
{
|
||||
vorbis_synthesis_restart(&dsp);
|
||||
}
|
||||
|
||||
void MKVVorbis::Close()
|
||||
{
|
||||
// TODO: benski> verify
|
||||
vorbis_info_clear(&info);
|
||||
vorbis_comment_clear(&comment);
|
||||
vorbis_dsp_clear(&dsp);
|
||||
vorbis_block_clear(&block);
|
||||
delete this;
|
||||
}
|
||||
#define CBCLASS MKVVorbis
|
||||
START_DISPATCH;
|
||||
//CB(OUTPUT_FRAME_SIZE, OutputFrameSize)
|
||||
CB(GET_OUTPUT_PROPERTIES, GetOutputProperties)
|
||||
CB(DECODE_BLOCK, DecodeBlock)
|
||||
VCB(FLUSH, Flush)
|
||||
VCB(CLOSE, Close)
|
||||
END_DISPATCH;
|
||||
#undef CBCLASS
|
@@ -1,41 +0,0 @@
|
||||
#pragma once
|
||||
#include "../in_mkv/ifc_mkvaudiodecoder.h"
|
||||
#include "../in_mkv/svc_mkvdecoder.h"
|
||||
#include <vorbis/codec.h>
|
||||
|
||||
// {6058D315-2F08-4b2f-903E-4C2E6B5EFFA9}
|
||||
static const GUID mkv_vorbis_guid =
|
||||
{ 0x6058d315, 0x2f08, 0x4b2f, { 0x90, 0x3e, 0x4c, 0x2e, 0x6b, 0x5e, 0xff, 0xa9 } };
|
||||
|
||||
|
||||
class MKVDecoderCreator : public svc_mkvdecoder
|
||||
{
|
||||
public:
|
||||
static const char *getServiceName() { return "Vorbis MKV Decoder"; }
|
||||
static GUID getServiceGuid() { return mkv_vorbis_guid; }
|
||||
int CreateAudioDecoder(const char *codec_id,
|
||||
const nsmkv::TrackEntryData *track_entry_data, const nsmkv::AudioData *audio_data,
|
||||
unsigned int preferred_bits, unsigned int max_channels, bool floating_point,
|
||||
ifc_mkvaudiodecoder **decoder);
|
||||
protected:
|
||||
RECVS_DISPATCH;
|
||||
};
|
||||
|
||||
class MKVVorbis : public ifc_mkvaudiodecoder
|
||||
{
|
||||
public:
|
||||
MKVVorbis();
|
||||
int DecodeBlock(void *inputBuffer, size_t inputBufferBytes, void *outputBuffer, size_t *outputBufferBytes);
|
||||
int GetOutputProperties(unsigned int *sampleRate, unsigned int *channels, unsigned int *bitsPerSample, bool *isFloat);
|
||||
void Flush();
|
||||
void Close();
|
||||
//private:
|
||||
unsigned int bps;
|
||||
vorbis_info info;
|
||||
vorbis_dsp_state dsp;
|
||||
vorbis_block block;
|
||||
vorbis_comment comment;
|
||||
ogg_int64_t packet_number;
|
||||
protected:
|
||||
RECVS_DISPATCH;
|
||||
};
|
Before Width: | Height: | Size: 782 B |
Before Width: | Height: | Size: 817 B |
Before Width: | Height: | Size: 753 B |
Before Width: | Height: | Size: 705 B |
Before Width: | Height: | Size: 725 B |
Before Width: | Height: | Size: 809 B |
Before Width: | Height: | Size: 824 B |
Before Width: | Height: | Size: 829 B |
Before Width: | Height: | Size: 720 B |
Before Width: | Height: | Size: 719 B |
Before Width: | Height: | Size: 727 B |
Before Width: | Height: | Size: 755 B |
@@ -1,177 +0,0 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by ogg.rc
|
||||
//
|
||||
#define IDS_NULLSOFT_VORBIS_DECODER_OLD 0
|
||||
#define IDS_PLEASE_ENTER_TAG_NAME 1
|
||||
#define IDS_TAG_NAME_CONTAINS_INVALID_CHARS 2
|
||||
#define IDOKAUTH 3
|
||||
#define IDS_ERASE_ALL_FIELDS_ON_LIST 3
|
||||
#define IDCANCELAUTH 4
|
||||
#define IDS_WARNING 4
|
||||
#define IDS_FILE_ERROR 5
|
||||
#define IDS_LENGTH 6
|
||||
#define IDS_AVERAGE_BITRATE 7
|
||||
#define IDS_FILE_SIZE 8
|
||||
#define IDS_NOMINAL_BITRATE 9
|
||||
#define IDS_MIN_BITRATE 10
|
||||
#define IDS_MAX_BITRATE 11
|
||||
#define IDS_CHANNELS 12
|
||||
#define IDS_SAMPLING_RATE 13
|
||||
#define IDS_SERIAL_NUMBER 14
|
||||
#define IDS_VERSION 15
|
||||
#define IDS_Vendor 16
|
||||
#define IDS_VENDOR 16
|
||||
#define IDS_TO_SIMPLE_MODE 17
|
||||
#define IDS_TO_ADVANCED_MODE 18
|
||||
#define IDS_OGG_VORBIS_INFO 19
|
||||
#define IDS_WRITE_ERROR 20
|
||||
#define IDS_BEST_RPM 21
|
||||
#define IDS_ABOUT 22
|
||||
#define IDS_LEAVE_AS_IS 24
|
||||
#define IDS_REMAP_6_CHANNELS 25
|
||||
#define IDS_DOWNMIX_TO_4_CHANNELS 26
|
||||
#define IDS_DOWNMIX_TO_2_CHANNELS_DS 27
|
||||
#define IDS_DOWNMIX_TO_2_CHANNELS_DS2 28
|
||||
#define IDS_DOWNMIX_TO_MONO 29
|
||||
#define IDS_CORRECT_FL_FC_FR_BL_BR_LFE 30
|
||||
#define IDS_BROKEN_FL_FR_FC_BL_BR_LFE 31
|
||||
#define IDS_IDLE 32
|
||||
#define IDS_ABOUT_TEXT 32
|
||||
#define IDS_LOWEST 33
|
||||
#define IDS_BELOW_NORMAL 34
|
||||
#define IDS_NORMAL 35
|
||||
#define IDS_ABOVE_NORMAL 36
|
||||
#define IDS_HIGHEST 37
|
||||
#define IDS_TIME_CRITICAL 38
|
||||
#define IDS_TITLE_PREFERENCES 39
|
||||
#define IDS_DO_NOT_ENABLE_24_BIT_OUTPUT 40
|
||||
#define IDS_ONE_TIME_FAQ_REMINDER 41
|
||||
#define IDS_RUNNING_ON_NT_OS 42
|
||||
#define IDS_RUNNING_ON_WIN9X 43
|
||||
#define IDS_NEVER 44
|
||||
#define IDS_PORT_80_ONLY 45
|
||||
#define IDS_ALWAYS 46
|
||||
#define IDS_SELECT_OUTPUT_DIRECTORY 47
|
||||
#define IDS_DECODING 48
|
||||
#define IDS_DISPLAY 49
|
||||
#define IDS_STREAMING 50
|
||||
#define IDS_CONNECTING 51
|
||||
#define IDS_PREBUFFERING 52
|
||||
#define IDS_AUTH_REQUIRED 53
|
||||
#define IDS_OGG_FILES 54
|
||||
#define IDS_NAME 55
|
||||
#define IDS_VALUE 56
|
||||
#define IDS_KBPS 57
|
||||
#define IDS_STRING2 58
|
||||
#define IDS_HZ 58
|
||||
#define IDS_GAME_SPEED 59
|
||||
#define IDS_STRING1 60
|
||||
#define IDS_BYTES 60
|
||||
#define IDS_FAMILY_STRING 61
|
||||
#define IDC_CONFIG_TAB1 101
|
||||
#define IDD_INFO_DLG 102
|
||||
#define IDC_CONFIG_TAB2 102
|
||||
#define IDC_CONFIG_TAB3 103
|
||||
#define IDD_INFO_DLG1 104
|
||||
#define IDC_CONFIG_TAB4 104
|
||||
#define IDD_ABOUT 112
|
||||
#define IDB_BITMAP1 115
|
||||
#define IDB_BITMAP2 116
|
||||
#define IDB_BITMAP3 117
|
||||
#define IDB_BITMAP4 118
|
||||
#define IDB_BITMAP5 119
|
||||
#define IDB_BITMAP6 120
|
||||
#define IDB_BITMAP7 121
|
||||
#define IDB_BITMAP8 122
|
||||
#define IDB_BITMAP9 123
|
||||
#define IDB_BITMAP10 124
|
||||
#define IDB_BITMAP11 125
|
||||
#define IDB_BITMAP12 126
|
||||
#define IDD_HTTPAUTH 128
|
||||
#define IDD_INFO 131
|
||||
#define IDD_DIALOG1 132
|
||||
#define IDD_CONFIG 132
|
||||
#define IDD_INFO_DLG_NEW 133
|
||||
#define IDD_INFO_PANEL_ADVANCED 134
|
||||
#define IDD_INFO_PANEL_SIMPLE 135
|
||||
#define IDB_PNG1 136
|
||||
#define IDB_PNG2 137
|
||||
#define IDB_PNG3 138
|
||||
#define IDB_PNG4 139
|
||||
#define IDB_PNG5 140
|
||||
#define IDB_PNG6 141
|
||||
#define IDB_PNG7 142
|
||||
#define IDB_PNG8 143
|
||||
#define IDB_PNG9 144
|
||||
#define IDB_PNG10 145
|
||||
#define IDB_PNG11 146
|
||||
#define IDB_PNG12 147
|
||||
#define IDC_LIST 1001
|
||||
#define IDC_NAME 1002
|
||||
#define IDC_TITLE 1002
|
||||
#define IDC_VALUE 1003
|
||||
#define IDC_ARTIST 1003
|
||||
#define IDC_HTTP_BSIZE 1004
|
||||
#define IDC_ALBUM 1004
|
||||
#define IDC_STREAM_SAVE 1005
|
||||
#define IDC_GENRE 1005
|
||||
#define IDC_FSAVE 1006
|
||||
#define IDC_YEAR 1006
|
||||
#define IDC_DATE 1006
|
||||
#define IDC_CUSTOM1 1007
|
||||
#define IDC_MISC 1007
|
||||
#define IDC_AVG_BR 1008
|
||||
#define IDC_FIX0R 1009
|
||||
#define IDC_PROXY 1012
|
||||
#define IDC_URL 1012
|
||||
#define IDC_SLIDER1 1013
|
||||
#define IDC_SLIDER2 1014
|
||||
#define IDC_BUTTON_ADD 1015
|
||||
#define IDC_BUTTON_DEL 1016
|
||||
#define IDC_BUTTON_DELALL 1017
|
||||
#define IDC_RPM 1018
|
||||
#define IDC_RPM2 1019
|
||||
#define IDC_MC6_DM 1020
|
||||
#define IDC_MC6_MAP 1021
|
||||
#define IDC_SSAVE_FMT 1022
|
||||
#define IDC_SSAVE_FMT_DEF 1023
|
||||
#define IDC_FULLBUF 1025
|
||||
#define IDC_EDITAUTH 1026
|
||||
#define IDC_REALM 1027
|
||||
#define IDC_TRACK 1028
|
||||
#define IDC_STATIC_MISC 1034
|
||||
#define IDC_STATIC_TAGS 1035
|
||||
#define IDC_STATIC_STD 1036
|
||||
#define IDC_STATIC_TRACK 1037
|
||||
#define IDC_SEPARATE 1038
|
||||
#define IDC_DELETE_ALL 1039
|
||||
#define IDC_RG 1040
|
||||
#define IDC_RG_MODE 1041
|
||||
#define IDC_NOCLIP 1042
|
||||
#define IDC_HARDLIMIT 1043
|
||||
#define IDC_PREAMP_STAT 1044
|
||||
#define IDC_TAB 1045
|
||||
#define IDC_MODE_TOGGLE 1053
|
||||
#define IDC_NEXT_STREAM 1054
|
||||
#define IDC_PREV_STREAM 1055
|
||||
#define IDC_STATIC_CS 1056
|
||||
#define IDC_HIDE_SPEC 1058
|
||||
#define IDC_COMMENT 1060
|
||||
#define IDC_ABOUT_TEXT 1061
|
||||
#define IDC_OS_BLAH 1062
|
||||
#define IDC_REMEMBER_INFOSIZE 1063
|
||||
#define IDC_FONTNAME 1064
|
||||
#define IDC_PREAMP_RG 1065
|
||||
#define IDS_NULLSOFT_VORBIS_DECODER 65534
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 148
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1067
|
||||
#define _APS_NEXT_SYMED_VALUE 105
|
||||
#endif
|
||||
#endif
|
@@ -1,108 +0,0 @@
|
||||
#ifndef _RF_H_
|
||||
#define _RF_H_
|
||||
|
||||
//based on Tempura specs.
|
||||
//NOT compatible with WA3 alphas
|
||||
|
||||
class WReader
|
||||
{
|
||||
protected:
|
||||
|
||||
/* WReader
|
||||
** WReader constructor
|
||||
*/
|
||||
WReader() : m_player(0) { }
|
||||
|
||||
public:
|
||||
|
||||
/* m_player
|
||||
** Filled by Winamp. Pointer to Winamp 3 core interface
|
||||
*/
|
||||
/*WPlayer_callback*/ void *m_player; //PP: hack. read_file.dll doesn't call it at all. simply don't touch it
|
||||
|
||||
/* GetDescription
|
||||
** Retrieves your plug-in's text description
|
||||
*/
|
||||
virtual char *GetDescription() { return "Unknown"; };
|
||||
|
||||
/* Open
|
||||
** Used to open a file, return 0 on success
|
||||
*/
|
||||
virtual int Open(char *url, bool *killswitch)=0;
|
||||
|
||||
/* Read
|
||||
** Returns number of BYTES read (if < length then eof or killswitch)
|
||||
*/
|
||||
virtual int Read(char *buffer, int length, bool *killswitch)=0;
|
||||
|
||||
/* GetLength
|
||||
** Returns length of the entire file in BYTES, return -1 on unknown/infinite (as for a stream)
|
||||
*/
|
||||
virtual int GetLength(void)=0;
|
||||
|
||||
/* CanSeek
|
||||
** Returns 1 if you can skip ahead in the file, 0 if not
|
||||
*/
|
||||
virtual int CanSeek(void)=0; //PP: currently available read_file.dll vesions can always seek in any direction
|
||||
|
||||
/* Seek
|
||||
** Jump to a certain absolute position
|
||||
*/
|
||||
virtual int Seek(int position, bool *killswitch)=0;
|
||||
|
||||
/* GetHeader
|
||||
** Retrieve header. Used in read_http to retrieve the HTTP header
|
||||
*/
|
||||
virtual char *GetHeader(char *name) { return 0; }
|
||||
|
||||
/* ~WReader
|
||||
** WReader virtual destructor
|
||||
*/
|
||||
//virtual ~WReader() { }
|
||||
virtual void Release(int) {};
|
||||
//PP: hack - shut up linker when getting rid of evil CRT library; seems to work OK under Tempura
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#define READ_VER 0x100
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* version
|
||||
** Version revision number
|
||||
*/
|
||||
int version;
|
||||
|
||||
/* description
|
||||
** Text description of the reader plug-in
|
||||
*/
|
||||
char *description;
|
||||
|
||||
/* create
|
||||
** Function pointer to create a reader module
|
||||
*/
|
||||
WReader *(*create)();
|
||||
|
||||
/* ismine
|
||||
** Determines whether or not a file should be read by this plug-in
|
||||
*/
|
||||
int (*ismine)(char *url);
|
||||
|
||||
} reader_source;
|
||||
|
||||
//exported symbol is:
|
||||
//int readerSource(HINSTANCE,reader_source**);
|
||||
|
||||
/*
|
||||
(not a part of Tempura specs)
|
||||
int _stdcall gzip_writefile(char* path,void* buf,DWORD size) - writes a memory block to a GZIP file - in_midi calls it from file info box
|
||||
|
||||
other hacks:
|
||||
recent versions understand file://... urls, can do partial file access (eg. "partial://00006666-66660000:c:\foo\bar.dat\zzz.wav" (zzz.wav is the "display name" + extension to make winamp select correct plug-in) and auto-detect CD drive letter (eg. #:\x.mp3 will scan all drives for that file; also works with partial:// )
|
||||
you can (for an example) build a playlist which will play Unreal soundtrack directly from the game CD on any system
|
||||
latest read_file.dll is bundled with the midi plug-in: http://www.blorp.com/~peter/zips/in_midi.zip
|
||||
*/
|
||||
|
||||
#endif
|
@@ -1,245 +0,0 @@
|
||||
#include "Shaper.h"
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.1415926535897932384626433832795028842
|
||||
#endif
|
||||
|
||||
#define RANDBUFLEN 65536
|
||||
|
||||
#define RINT(x) ((x) >= 0 ? ((int)((x) + 0.5)) : ((int)((x) - 0.5)))
|
||||
|
||||
const int scoeffreq[] =
|
||||
{
|
||||
0, 48000, 44100, 37800, 32000, 22050, 48000, 44100
|
||||
};
|
||||
|
||||
|
||||
const int scoeflen[] =
|
||||
{
|
||||
1, 16, 20, 16, 16, 15, 16, 15
|
||||
};
|
||||
|
||||
const int samp[] =
|
||||
{
|
||||
8, 18, 27, 8, 8, 8, 10, 9
|
||||
};
|
||||
|
||||
const double shapercoefs[8][21] =
|
||||
{
|
||||
{
|
||||
-1
|
||||
}
|
||||
, /* triangular dither */
|
||||
|
||||
{ -2.8720729351043701172, 5.0413231849670410156, -6.2442994117736816406, 5.8483986854553222656,
|
||||
-3.7067542076110839844, 1.0495119094848632812, 1.1830236911773681641, -2.1126792430877685547,
|
||||
1.9094531536102294922, -0.99913084506988525391, 0.17090806365013122559, 0.32615602016448974609,
|
||||
-0.39127644896507263184, 0.26876461505889892578, -0.097676105797290802002, 0.023473845794796943665,
|
||||
}, /* 48k, N=16, amp=18 */
|
||||
|
||||
{ -2.6773197650909423828, 4.8308925628662109375, -6.570110321044921875, 7.4572014808654785156,
|
||||
-6.7263274192810058594, 4.8481650352478027344, -2.0412089824676513672, -0.7006359100341796875,
|
||||
2.9537565708160400391, -4.0800385475158691406, 4.1845216751098632812, -3.3311812877655029297,
|
||||
2.1179926395416259766, -0.879302978515625, 0.031759146600961685181, 0.42382788658142089844,
|
||||
-0.47882103919982910156, 0.35490813851356506348, -0.17496839165687561035, 0.060908168554306030273,
|
||||
}, /* 44.1k, N=20, amp=27 */
|
||||
|
||||
{ -1.6335992813110351562, 2.2615492343902587891, -2.4077029228210449219, 2.6341717243194580078,
|
||||
-2.1440362930297851562, 1.8153258562088012695, -1.0816224813461303711, 0.70302653312683105469,
|
||||
-0.15991993248462677002, -0.041549518704414367676, 0.29416576027870178223, -0.2518316805362701416,
|
||||
0.27766478061676025391, -0.15785403549671173096, 0.10165894031524658203, -0.016833892092108726501,
|
||||
}, /* 37.8k, N=16 */
|
||||
|
||||
{ -0.82901298999786376953, 0.98922657966613769531, -0.59825712442398071289, 1.0028809309005737305,
|
||||
-0.59938216209411621094, 0.79502451419830322266, -0.42723315954208374023, 0.54492527246475219727,
|
||||
-0.30792605876922607422, 0.36871799826622009277, -0.18792048096656799316, 0.2261127084493637085,
|
||||
-0.10573341697454452515, 0.11435490846633911133, -0.038800679147243499756, 0.040842197835445404053,
|
||||
}, /* 32k, N=16 */
|
||||
|
||||
{ -0.065229974687099456787, 0.54981261491775512695, 0.40278548002243041992, 0.31783768534660339355,
|
||||
0.28201797604560852051, 0.16985194385051727295, 0.15433363616466522217, 0.12507140636444091797,
|
||||
0.08903945237398147583, 0.064410120248794555664, 0.047146003693342208862, 0.032805237919092178345,
|
||||
0.028495194390416145325, 0.011695005930960178375, 0.011831838637590408325,
|
||||
}, /* 22.05k, N=15 */
|
||||
|
||||
{ -2.3925774097442626953, 3.4350297451019287109, -3.1853709220886230469, 1.8117271661758422852,
|
||||
0.20124770700931549072, -1.4759907722473144531, 1.7210904359817504883, -0.97746700048446655273,
|
||||
0.13790138065814971924, 0.38185903429985046387, -0.27421241998672485352, -0.066584214568138122559,
|
||||
0.35223302245140075684, -0.37672343850135803223, 0.23964276909828186035, -0.068674825131893157959,
|
||||
}, /* 48k, N=16, amp=10 */
|
||||
|
||||
{ -2.0833916664123535156, 3.0418450832366943359, -3.2047898769378662109, 2.7571926116943359375,
|
||||
-1.4978630542755126953, 0.3427594602108001709, 0.71733748912811279297, -1.0737057924270629883,
|
||||
1.0225815773010253906, -0.56649994850158691406, 0.20968692004680633545, 0.065378531813621520996,
|
||||
-0.10322438180446624756, 0.067442022264003753662, 0.00495197344571352005,
|
||||
}, /* 44.1k, N=15, amp=9 */
|
||||
|
||||
#if 0
|
||||
{ -3.0259189605712890625, 6.0268716812133789062, -9.195003509521484375, 11.824929237365722656,
|
||||
-12.767142295837402344, 11.917946815490722656, -9.1739168167114257812, 5.3712320327758789062,
|
||||
-1.1393624544143676758, -2.4484779834747314453, 4.9719839096069335938, -6.0392003059387207031,
|
||||
5.9359521865844726562, -4.903278350830078125, 3.5527443885803222656, -2.1909697055816650391,
|
||||
1.1672389507293701172, -0.4903914332389831543, 0.16519790887832641602, -0.023217858746647834778,
|
||||
}, /* 44.1k, N=20 */
|
||||
#endif
|
||||
};
|
||||
|
||||
#define POOLSIZE 97
|
||||
|
||||
Shaper::Shaper(int freq, int _nch, int min, int max, int _dtype, int pdf, double noiseamp)
|
||||
{
|
||||
int i;
|
||||
float pool[POOLSIZE] = {0};
|
||||
|
||||
nch = _nch;
|
||||
dtype = _dtype;
|
||||
|
||||
for (i = 1;i < 6;i++) if (freq == scoeffreq[i]) break;
|
||||
/* if ((dtype == 3 || dtype == 4) && i == 6) {
|
||||
fprintf(stderr,"Warning: ATH based noise shaping for destination frequency %dHz is not available, using triangular dither\n",freq);
|
||||
}*/
|
||||
if (dtype == 2 || i == 6) i = 0;
|
||||
if (dtype == 4 && (i == 1 || i == 2)) i += 5;
|
||||
|
||||
shaper_type = i;
|
||||
|
||||
shapebuf = (double**)malloc(sizeof(double *) * nch);
|
||||
shaper_len = scoeflen[shaper_type];
|
||||
|
||||
for (i = 0;i < nch;i++)
|
||||
shapebuf[i] = (double*)calloc(shaper_len, sizeof(double));
|
||||
|
||||
shaper_clipmin = min;
|
||||
shaper_clipmax = max;
|
||||
|
||||
randbuf = (REAL*)malloc(sizeof(REAL) * RANDBUFLEN);
|
||||
|
||||
for (i = 0;i < POOLSIZE;i++) pool[i] = warandf();
|
||||
|
||||
switch (pdf)
|
||||
{
|
||||
case DITHER_RECTANGLE: // rectangular
|
||||
for (i = 0;i < RANDBUFLEN;i++)
|
||||
{
|
||||
float r;
|
||||
int p;
|
||||
|
||||
p = warand() % POOLSIZE;
|
||||
r = pool[p]; pool[p] = warandf();
|
||||
randbuf[i] = (REAL)(noiseamp * (((double)r) - 0.5));
|
||||
}
|
||||
break;
|
||||
|
||||
case DITHER_TRIANGLE:
|
||||
for (i = 0;i < RANDBUFLEN;i++)
|
||||
{
|
||||
float r1, r2;
|
||||
int p;
|
||||
|
||||
p = warand() % POOLSIZE;
|
||||
r1 = pool[p]; pool[p] = warandf();
|
||||
p = warand() % POOLSIZE;
|
||||
r2 = pool[p]; pool[p] = warandf();
|
||||
randbuf[i] = (REAL)(noiseamp * ((((double)r1)) - (((double)r2))));
|
||||
}
|
||||
break;
|
||||
#if 0
|
||||
case DITHER_GAUSSIAN: // gaussian
|
||||
for (i = 0;i < RANDBUFLEN;i++)
|
||||
{
|
||||
int sw = 0;
|
||||
double t, u;
|
||||
double r;
|
||||
int p;
|
||||
|
||||
if (sw == 0)
|
||||
{
|
||||
sw = 1;
|
||||
|
||||
p = warand() % POOLSIZE;
|
||||
r = ((double)pool[p]); pool[p] = warandf();
|
||||
|
||||
t = sqrt(-2 * log(1 - r));
|
||||
|
||||
p = warand() % POOLSIZE;
|
||||
r = ((double)pool[p]); pool[p] = warandf();
|
||||
|
||||
u = 2 * M_PI * r;
|
||||
|
||||
randbuf[i] = noiseamp * t * cos(u);
|
||||
}
|
||||
else
|
||||
{
|
||||
sw = 0;
|
||||
|
||||
randbuf[i] = noiseamp * t * sin(u);
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
randptr = 0;
|
||||
|
||||
// if (dtype == 0 || dtype == 1) return 1;
|
||||
//return samp[shaper_type];
|
||||
}
|
||||
|
||||
Shaper::~Shaper()
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0;i < nch;i++) free(shapebuf[i]);
|
||||
free(shapebuf);
|
||||
free(randbuf);
|
||||
}
|
||||
|
||||
int Shaper::do_shaping(double s,/*double *peak,*/int ch)
|
||||
{
|
||||
double u, h;
|
||||
int i;
|
||||
|
||||
if (dtype == 1)
|
||||
{
|
||||
s += randbuf[randptr++ & (RANDBUFLEN-1)];
|
||||
|
||||
if (s < shaper_clipmin)
|
||||
{
|
||||
//double d = (double)s / shaper_clipmin;
|
||||
//*peak = *peak < d ? d : *peak;
|
||||
s = shaper_clipmin;
|
||||
}
|
||||
if (s > shaper_clipmax)
|
||||
{
|
||||
//double d = (double)s / shaper_clipmax;
|
||||
//*peak = *peak < d ? d : *peak;
|
||||
s = shaper_clipmax;
|
||||
}
|
||||
|
||||
return RINT(s);
|
||||
}
|
||||
|
||||
h = 0;
|
||||
for (i = 0;i < shaper_len;i++)
|
||||
h += shapercoefs[shaper_type][i] * shapebuf[ch][i];
|
||||
s += h;
|
||||
u = s;
|
||||
s += randbuf[randptr++ & (RANDBUFLEN-1)];
|
||||
if (s < shaper_clipmin)
|
||||
{
|
||||
//double d = (double)s / shaper_clipmin;
|
||||
//*peak = *peak < d ? d : *peak;
|
||||
s = shaper_clipmin;
|
||||
}
|
||||
if (s > shaper_clipmax)
|
||||
{
|
||||
//double d = (double)s / shaper_clipmax;
|
||||
//*peak = *peak < d ? d : *peak;
|
||||
s = shaper_clipmax;
|
||||
}
|
||||
s = RINT(s);
|
||||
for (i = shaper_len - 2;i >= 0;i--) shapebuf[ch][i+1] = shapebuf[ch][i];
|
||||
shapebuf[ch][0] = s - u;
|
||||
|
||||
return (int)s;
|
||||
}
|
@@ -1,30 +0,0 @@
|
||||
//from SSRC
|
||||
#ifndef NULLSOFT_VORBIS_SHAPER_H
|
||||
#define NULLSOFT_VORBIS_SHAPER_H
|
||||
#include "main.h"
|
||||
|
||||
typedef float REAL;
|
||||
enum
|
||||
{
|
||||
DITHER_RECTANGLE=0,
|
||||
DITHER_TRIANGLE=1,
|
||||
DITHER_GAUSSIAN=2,
|
||||
};
|
||||
class Shaper
|
||||
{
|
||||
double **shapebuf;
|
||||
int shaper_type,shaper_len,shaper_clipmin,shaper_clipmax;
|
||||
REAL *randbuf;
|
||||
int randptr;
|
||||
int dtype;
|
||||
int nch;
|
||||
|
||||
public:
|
||||
Shaper(int freq,int _nch,int min,int max,int _dtype,int pdf,double noiseamp);
|
||||
|
||||
int do_shaping(double s,/*double *peak,*/int ch);
|
||||
|
||||
~Shaper();
|
||||
};
|
||||
|
||||
#endif
|
@@ -1,2 +0,0 @@
|
||||
#include "main.h"
|
||||
|
@@ -1,491 +0,0 @@
|
||||
/* This program is licensed under the GNU Library General Public License, version 2,
|
||||
* a copy of which is included with this program (LICENCE.LGPL).
|
||||
*
|
||||
* (c) 2000-2001 Michael Smith <msmith@labyrinth.net.au>
|
||||
*
|
||||
*
|
||||
* Comment editing backend, suitable for use by nice frontend interfaces.
|
||||
*
|
||||
* last modified: $Id: vcedit.c,v 1.3 2013/10/22 14:17:11 dromagod Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include <vorbis/codec.h>
|
||||
|
||||
#include "vcedit.h"
|
||||
//#include "i18n.h"
|
||||
|
||||
|
||||
#define CHUNKSIZE 4096
|
||||
|
||||
vcedit_state *vcedit_new_state(void)
|
||||
{
|
||||
vcedit_state *state = malloc(sizeof(vcedit_state));
|
||||
memset(state, 0, sizeof(vcedit_state));
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
char *vcedit_error(vcedit_state *state)
|
||||
{
|
||||
return state->lasterror;
|
||||
}
|
||||
|
||||
vorbis_comment *vcedit_comments(vcedit_state *state)
|
||||
{
|
||||
return state->vc;
|
||||
}
|
||||
|
||||
static void vcedit_clear_internals(vcedit_state *state)
|
||||
{
|
||||
if(state->vc)
|
||||
{
|
||||
vorbis_comment_clear(state->vc);
|
||||
free(state->vc);
|
||||
}
|
||||
if(state->os)
|
||||
{
|
||||
ogg_stream_clear(state->os);
|
||||
free(state->os);
|
||||
}
|
||||
if(state->oy)
|
||||
{
|
||||
ogg_sync_clear(state->oy);
|
||||
free(state->oy);
|
||||
}
|
||||
if(state->vendor)
|
||||
free(state->vendor);
|
||||
if(state->mainbuf)
|
||||
free(state->mainbuf);
|
||||
if(state->bookbuf)
|
||||
free(state->bookbuf);
|
||||
if(state->vi) {
|
||||
vorbis_info_clear(state->vi);
|
||||
free(state->vi);
|
||||
}
|
||||
|
||||
memset(state, 0, sizeof(*state));
|
||||
}
|
||||
|
||||
void vcedit_clear(vcedit_state *state)
|
||||
{
|
||||
if(state)
|
||||
{
|
||||
vcedit_clear_internals(state);
|
||||
free(state);
|
||||
}
|
||||
}
|
||||
|
||||
/* Next two functions pulled straight from libvorbis, apart from one change
|
||||
* - we don't want to overwrite the vendor string.
|
||||
*/
|
||||
static void _v_writestring(oggpack_buffer *o,char *s, int len)
|
||||
{
|
||||
while(len--)
|
||||
{
|
||||
oggpack_write(o,*s++,8);
|
||||
}
|
||||
}
|
||||
|
||||
static int _commentheader_out(vorbis_comment *vc, char *vendor, ogg_packet *op)
|
||||
{
|
||||
oggpack_buffer opb;
|
||||
|
||||
oggpack_writeinit(&opb);
|
||||
|
||||
/* preamble */
|
||||
oggpack_write(&opb,0x03,8);
|
||||
_v_writestring(&opb,"vorbis", 6);
|
||||
|
||||
/* vendor */
|
||||
oggpack_write(&opb,(unsigned long)strlen(vendor),32);
|
||||
_v_writestring(&opb,vendor, (int)strlen(vendor));
|
||||
|
||||
/* comments */
|
||||
oggpack_write(&opb,vc->comments,32);
|
||||
if(vc->comments){
|
||||
int i;
|
||||
for(i=0;i<vc->comments;i++){
|
||||
if(vc->user_comments[i]){
|
||||
oggpack_write(&opb,vc->comment_lengths[i],32);
|
||||
_v_writestring(&opb,vc->user_comments[i],
|
||||
vc->comment_lengths[i]);
|
||||
}else{
|
||||
oggpack_write(&opb,0,32);
|
||||
}
|
||||
}
|
||||
}
|
||||
oggpack_write(&opb,1,1);
|
||||
|
||||
op->packet = _ogg_malloc(oggpack_bytes(&opb));
|
||||
memcpy(op->packet, opb.buffer, oggpack_bytes(&opb));
|
||||
|
||||
op->bytes=oggpack_bytes(&opb);
|
||||
op->b_o_s=0;
|
||||
op->e_o_s=0;
|
||||
op->granulepos=0;
|
||||
|
||||
oggpack_writeclear(&opb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _blocksize(vcedit_state *s, ogg_packet *p)
|
||||
{
|
||||
int this = vorbis_packet_blocksize(s->vi, p);
|
||||
int ret = (this + s->prevW)/4;
|
||||
|
||||
if(!s->prevW)
|
||||
{
|
||||
s->prevW = this;
|
||||
return 0;
|
||||
}
|
||||
|
||||
s->prevW = this;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int _fetch_next_packet(vcedit_state *s, ogg_packet *p, ogg_page *page)
|
||||
{
|
||||
int result = ogg_stream_packetout(s->os, p);
|
||||
|
||||
if(result > 0)
|
||||
return 1;
|
||||
else
|
||||
{
|
||||
if(s->eosin)
|
||||
return 0;
|
||||
while(ogg_sync_pageout(s->oy, page) <= 0)
|
||||
{
|
||||
char *buffer = ogg_sync_buffer(s->oy, CHUNKSIZE);
|
||||
int bytes = (int)s->read(buffer,1, CHUNKSIZE, s->in);
|
||||
ogg_sync_wrote(s->oy, bytes);
|
||||
if(bytes == 0)
|
||||
return 0;
|
||||
}
|
||||
if(ogg_page_eos(page))
|
||||
s->eosin = 1;
|
||||
else if(ogg_page_serialno(page) != s->serial)
|
||||
{
|
||||
s->eosin = 1;
|
||||
s->extrapage = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ogg_stream_pagein(s->os, page);
|
||||
return _fetch_next_packet(s, p, page);
|
||||
}
|
||||
}
|
||||
|
||||
int vcedit_open(vcedit_state *state, FILE *in)
|
||||
{
|
||||
return vcedit_open_callbacks(state, (void *)in,
|
||||
(vcedit_read_func)fread, (vcedit_write_func)fwrite);
|
||||
}
|
||||
|
||||
int vcedit_open_callbacks(vcedit_state *state, void *in,
|
||||
vcedit_read_func read_func, vcedit_write_func write_func)
|
||||
{
|
||||
|
||||
char *buffer;
|
||||
int bytes,i;
|
||||
ogg_packet *header;
|
||||
ogg_packet header_main;
|
||||
ogg_packet header_comments;
|
||||
ogg_packet header_codebooks;
|
||||
ogg_page og;
|
||||
|
||||
state->in = in;
|
||||
state->read = read_func;
|
||||
state->write = write_func;
|
||||
|
||||
state->oy = malloc(sizeof(ogg_sync_state));
|
||||
ogg_sync_init(state->oy);
|
||||
|
||||
buffer = ogg_sync_buffer(state->oy, CHUNKSIZE);
|
||||
bytes = (int)state->read(buffer, 1, CHUNKSIZE, state->in);
|
||||
|
||||
ogg_sync_wrote(state->oy, bytes);
|
||||
|
||||
if(ogg_sync_pageout(state->oy, &og) != 1)
|
||||
{
|
||||
if(bytes<CHUNKSIZE)
|
||||
state->lasterror = "Input truncated or empty.";
|
||||
else
|
||||
state->lasterror = "Input is not an Ogg bitstream.";
|
||||
goto err;
|
||||
}
|
||||
|
||||
state->serial = ogg_page_serialno(&og);
|
||||
|
||||
state->os = malloc(sizeof(ogg_stream_state));
|
||||
ogg_stream_init(state->os, state->serial);
|
||||
|
||||
state->vi = malloc(sizeof(vorbis_info));
|
||||
vorbis_info_init(state->vi);
|
||||
|
||||
state->vc = malloc(sizeof(vorbis_comment));
|
||||
vorbis_comment_init(state->vc);
|
||||
|
||||
if(ogg_stream_pagein(state->os, &og) < 0)
|
||||
{
|
||||
state->lasterror = "Error reading first page of Ogg bitstream.";
|
||||
goto err;
|
||||
}
|
||||
|
||||
if(ogg_stream_packetout(state->os, &header_main) != 1)
|
||||
{
|
||||
state->lasterror = "Error reading initial header packet.";
|
||||
goto err;
|
||||
}
|
||||
|
||||
if(vorbis_synthesis_headerin(state->vi, state->vc, &header_main) < 0)
|
||||
{
|
||||
state->lasterror = "Ogg bitstream does not contain vorbis data.";
|
||||
goto err;
|
||||
}
|
||||
|
||||
state->mainlen = header_main.bytes;
|
||||
state->mainbuf = malloc(state->mainlen);
|
||||
memcpy(state->mainbuf, header_main.packet, header_main.bytes);
|
||||
|
||||
i = 0;
|
||||
header = &header_comments;
|
||||
while(i<2) {
|
||||
while(i<2) {
|
||||
int result = ogg_sync_pageout(state->oy, &og);
|
||||
if(result == 0) break; /* Too little data so far */
|
||||
else if(result == 1)
|
||||
{
|
||||
ogg_stream_pagein(state->os, &og);
|
||||
while(i<2)
|
||||
{
|
||||
result = ogg_stream_packetout(state->os, header);
|
||||
if(result == 0) break;
|
||||
if(result == -1)
|
||||
{
|
||||
state->lasterror = "Corrupt secondary header.";
|
||||
goto err;
|
||||
}
|
||||
vorbis_synthesis_headerin(state->vi, state->vc, header);
|
||||
if(i==1)
|
||||
{
|
||||
state->booklen = header->bytes;
|
||||
state->bookbuf = malloc(state->booklen);
|
||||
memcpy(state->bookbuf, header->packet,
|
||||
header->bytes);
|
||||
}
|
||||
i++;
|
||||
header = &header_codebooks;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buffer = ogg_sync_buffer(state->oy, CHUNKSIZE);
|
||||
bytes = (int)state->read(buffer, 1, CHUNKSIZE, state->in);
|
||||
if(bytes == 0 && i < 2)
|
||||
{
|
||||
state->lasterror = "EOF before end of vorbis headers.";
|
||||
goto err;
|
||||
}
|
||||
ogg_sync_wrote(state->oy, bytes);
|
||||
}
|
||||
|
||||
/* Copy the vendor tag */
|
||||
bytes = (int)strlen(state->vc->vendor);
|
||||
state->vendor = malloc(bytes +1);
|
||||
strncpy(state->vendor, state->vc->vendor, bytes);
|
||||
|
||||
/* Headers are done! */
|
||||
return 0;
|
||||
|
||||
err:
|
||||
vcedit_clear_internals(state);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int vcedit_write(vcedit_state *state, void *out)
|
||||
{
|
||||
ogg_stream_state streamout;
|
||||
ogg_packet header_main;
|
||||
ogg_packet header_comments;
|
||||
ogg_packet header_codebooks;
|
||||
|
||||
ogg_page ogout, ogin;
|
||||
ogg_packet op;
|
||||
ogg_int64_t granpos = 0;
|
||||
int result;
|
||||
char *buffer;
|
||||
int bytes;
|
||||
int needflush=0, needout=0;
|
||||
|
||||
state->eosin = 0;
|
||||
state->extrapage = 0;
|
||||
|
||||
header_main.bytes = state->mainlen;
|
||||
header_main.packet = state->mainbuf;
|
||||
header_main.b_o_s = 1;
|
||||
header_main.e_o_s = 0;
|
||||
header_main.granulepos = 0;
|
||||
|
||||
header_codebooks.bytes = state->booklen;
|
||||
header_codebooks.packet = state->bookbuf;
|
||||
header_codebooks.b_o_s = 0;
|
||||
header_codebooks.e_o_s = 0;
|
||||
header_codebooks.granulepos = 0;
|
||||
|
||||
ogg_stream_init(&streamout, state->serial);
|
||||
|
||||
_commentheader_out(state->vc, state->vendor, &header_comments);
|
||||
|
||||
ogg_stream_packetin(&streamout, &header_main);
|
||||
ogg_stream_packetin(&streamout, &header_comments);
|
||||
ogg_stream_packetin(&streamout, &header_codebooks);
|
||||
|
||||
while((result = ogg_stream_flush(&streamout, &ogout)))
|
||||
{
|
||||
if(state->write(ogout.header,1,ogout.header_len, out) !=
|
||||
(size_t) ogout.header_len)
|
||||
goto cleanup;
|
||||
if(state->write(ogout.body,1,ogout.body_len, out) !=
|
||||
(size_t) ogout.body_len)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
while(_fetch_next_packet(state, &op, &ogin))
|
||||
{
|
||||
int size;
|
||||
size = _blocksize(state, &op);
|
||||
granpos += size;
|
||||
|
||||
if(needflush)
|
||||
{
|
||||
if(ogg_stream_flush(&streamout, &ogout))
|
||||
{
|
||||
if(state->write(ogout.header,1,ogout.header_len,
|
||||
out) != (size_t) ogout.header_len)
|
||||
goto cleanup;
|
||||
if(state->write(ogout.body,1,ogout.body_len,
|
||||
out) != (size_t) ogout.body_len)
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
else if(needout)
|
||||
{
|
||||
if(ogg_stream_pageout(&streamout, &ogout))
|
||||
{
|
||||
if(state->write(ogout.header,1,ogout.header_len,
|
||||
out) != (size_t) ogout.header_len)
|
||||
goto cleanup;
|
||||
if(state->write(ogout.body,1,ogout.body_len,
|
||||
out) != (size_t) ogout.body_len)
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
needflush=needout=0;
|
||||
|
||||
if(op.granulepos == -1)
|
||||
{
|
||||
op.granulepos = granpos;
|
||||
ogg_stream_packetin(&streamout, &op);
|
||||
}
|
||||
else /* granulepos is set, validly. Use it, and force a flush to
|
||||
account for shortened blocks (vcut) when appropriate */
|
||||
{
|
||||
if(granpos > op.granulepos)
|
||||
{
|
||||
granpos = op.granulepos;
|
||||
ogg_stream_packetin(&streamout, &op);
|
||||
needflush=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ogg_stream_packetin(&streamout, &op);
|
||||
needout=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
streamout.e_o_s = 1;
|
||||
while(ogg_stream_flush(&streamout, &ogout))
|
||||
{
|
||||
if(state->write(ogout.header,1,ogout.header_len,
|
||||
out) != (size_t) ogout.header_len)
|
||||
goto cleanup;
|
||||
if(state->write(ogout.body,1,ogout.body_len,
|
||||
out) != (size_t) ogout.body_len)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (state->extrapage)
|
||||
{
|
||||
if(state->write(ogin.header,1,ogin.header_len,
|
||||
out) != (size_t) ogin.header_len)
|
||||
goto cleanup;
|
||||
if (state->write(ogin.body,1,ogin.body_len, out) !=
|
||||
(size_t) ogin.body_len)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
state->eosin=0; /* clear it, because not all paths to here do */
|
||||
while(!state->eosin) /* We reached eos, not eof */
|
||||
{
|
||||
/* We copy the rest of the stream (other logical streams)
|
||||
* through, a page at a time. */
|
||||
while(1)
|
||||
{
|
||||
result = ogg_sync_pageout(state->oy, &ogout);
|
||||
if(result==0)
|
||||
break;
|
||||
if(result<0)
|
||||
state->lasterror = "Corrupt or missing data, continuing...";
|
||||
else
|
||||
{
|
||||
/* Don't bother going through the rest, we can just
|
||||
* write the page out now */
|
||||
if(state->write(ogout.header,1,ogout.header_len,
|
||||
out) != (size_t) ogout.header_len) {
|
||||
// fprintf(stderr, "Bumming out\n");
|
||||
goto cleanup;
|
||||
}
|
||||
if(state->write(ogout.body,1,ogout.body_len, out) !=
|
||||
(size_t) ogout.body_len) {
|
||||
// fprintf(stderr, "Bumming out 2\n");
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
}
|
||||
buffer = ogg_sync_buffer(state->oy, CHUNKSIZE);
|
||||
bytes = (int)state->read(buffer,1, CHUNKSIZE, state->in);
|
||||
ogg_sync_wrote(state->oy, bytes);
|
||||
if(bytes == 0)
|
||||
{
|
||||
state->eosin = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
cleanup:
|
||||
ogg_stream_clear(&streamout);
|
||||
ogg_packet_clear(&header_comments);
|
||||
|
||||
free(state->mainbuf);
|
||||
free(state->bookbuf);
|
||||
state->mainbuf = state->bookbuf = NULL;
|
||||
|
||||
if(!state->eosin)
|
||||
{
|
||||
state->lasterror =
|
||||
"Error writing stream to output. "
|
||||
"Output stream may be corrupted or truncated.";
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -1,62 +0,0 @@
|
||||
/* This program is licensed under the GNU Library General Public License, version 2,
|
||||
* a copy of which is included with this program (with filename LICENSE.LGPL).
|
||||
*
|
||||
* (c) 2000-2001 Michael Smith <msmith@labyrinth.net.au>
|
||||
*
|
||||
* VCEdit header.
|
||||
*
|
||||
* last modified: $ID:$
|
||||
*/
|
||||
|
||||
#ifndef __VCEDIT_H
|
||||
#define __VCEDIT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include <vorbis/codec.h>
|
||||
|
||||
typedef size_t (*vcedit_read_func)(void *, size_t, size_t, void *);
|
||||
typedef size_t (*vcedit_write_func)(const void *, size_t, size_t, void *);
|
||||
|
||||
typedef struct {
|
||||
ogg_sync_state *oy;
|
||||
ogg_stream_state *os;
|
||||
|
||||
vorbis_comment *vc;
|
||||
vorbis_info *vi;
|
||||
|
||||
vcedit_read_func read;
|
||||
vcedit_write_func write;
|
||||
|
||||
void *in;
|
||||
long serial;
|
||||
unsigned char *mainbuf;
|
||||
unsigned char *bookbuf;
|
||||
int mainlen;
|
||||
int booklen;
|
||||
char *lasterror;
|
||||
char *vendor;
|
||||
int prevW;
|
||||
int extrapage;
|
||||
int eosin;
|
||||
} vcedit_state;
|
||||
|
||||
extern vcedit_state * vcedit_new_state(void);
|
||||
extern void vcedit_clear(vcedit_state *state);
|
||||
extern vorbis_comment * vcedit_comments(vcedit_state *state);
|
||||
extern int vcedit_open(vcedit_state *state, FILE *in);
|
||||
extern int vcedit_open_callbacks(vcedit_state *state, void *in,
|
||||
vcedit_read_func read_func, vcedit_write_func write_func);
|
||||
extern int vcedit_write(vcedit_state *state, void *out);
|
||||
extern char * vcedit_error(vcedit_state *state);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __VCEDIT_H */
|
||||
|
@@ -1,39 +0,0 @@
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
#include "../../../Winamp/buildType.h"
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,79,0,0
|
||||
PRODUCTVERSION WINAMP_PRODUCTVER
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x4L
|
||||
FILETYPE 0x2L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Winamp SA"
|
||||
VALUE "FileDescription", "Winamp Input Plug-in"
|
||||
VALUE "FileVersion", "1,79,0,0"
|
||||
VALUE "InternalName", "Nullsoft Vorbis Decoder"
|
||||
VALUE "LegalCopyright", "Copyright <20> 2001-2023 Winamp SA"
|
||||
VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA"
|
||||
VALUE "OriginalFilename", "in_vorbis.dll"
|
||||
VALUE "ProductName", "Winamp"
|
||||
VALUE "ProductVersion", STR_WINAMP_PRODUCTVER
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
@@ -1,2 +0,0 @@
|
||||
#include "main.h"
|
||||
#include "api__in_vorbis.h"
|