pax_global_header00006660000000000000000000000064117261552660014525gustar00rootroot0000000000000052 comment=d5c211f7f5ed815437b4dbd880bf2fa3af7105e1 intone-0.77+git20120308/000077500000000000000000000000001172615526600143555ustar00rootroot00000000000000intone-0.77+git20120308/.gitignore000066400000000000000000000002701172615526600163440ustar00rootroot00000000000000INSTALL Makefile Makefile.in aclocal.m4 autom4te.cache config.h config.h* config.log config.status configure depcomp install-sh intone-*.tar.gz missing .deps .libs stamp-h1 *.o intone intone-0.77+git20120308/AUTHORS000066400000000000000000000000471172615526600154260ustar00rootroot00000000000000chaitanya chandel (cchandel@yahoo.com) intone-0.77+git20120308/COPYING000066400000000000000000001045141172615526600154150ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work 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. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 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 the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. 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. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. 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. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . intone-0.77+git20120308/ChangeLog000066400000000000000000000000001172615526600161150ustar00rootroot00000000000000intone-0.77+git20120308/Makefile.am000066400000000000000000000002501172615526600164060ustar00rootroot00000000000000MAINTAINERCLEANFILES = \ Makefile.in \ INSTALL \ aclocal.m4 \ config.h.in \ config.h.in~ \ configure \ depcomp \ install-sh \ missing SUBDIRS = src resources intone-0.77+git20120308/NEWS000066400000000000000000000064101172615526600150550ustar00rootroot0000000000000027 Jul 09 - ver 0.61 * minor GUI changes * progress during scan * settings shows bt when streaming to bt * more tolerant streaming over bt * bt button support * previous key followed by pause key not pausing fix 19 Jul 09 * (hopefully) better top bar in playlist view * change priority from gui * change playing song icon to play in list * fixes to better support logical order when changing from random->normal and vice versa * support bluetooth streaming to A2DP sets from intone (__you'll have to pair the headset yourself__) * better time display on progress bar * even better scan routine (please rescan your songs for the right names to be picked up) * some code speedups * fixed ui break in album art view with long song names 09 Jul 09 * better (and more stable) music scan routine * support for mp3/ogg tags * search by artists * other minor fixes * 1 regression - the duration slider is jumpy - will sort that out in the next release 20 May 09 * Fixed crash on end of playlist (bug introduced in 0.50) * Intone now remembers your bass and treble settings. * It restores all system audio settings on pause and exit. 17 May 09 - ver 0.50 * random play * seek-back button now seeks to 0 on the first press * next press goes plays the last song * better (imo) no album art image 15 May 09 * All artwork in svn 14 May 09 * Settings page to set bass, treble, ui size and playlist looping * Album art view toggle. Save the album art image as 'cover.jpg' in the songs directory. * prevent suspend during playing * pause on incoming call 07 May 09 * Bass and treble sliders * better sizes (imo) * dbus integration - prevent suspend and pause on incoming call * alternate ciew with id3 and album art * default icon if no album art exists * some clean ups * icon change of play button to pause when playing 13 Apr 09 - more fixes (and feedback from Yogiz) * moved all playlists to genlists for speed * fixed a bug where files with their extensions in caps were not added to playlist * rescanning of folders now works fine * fixed a bug where after playing the last song in the playlist intone would hang 12 Apr 09 - Some fixes and polish * fixed the hang on song end if using mplayer to set song position * fixed playlist last song end stuff * polished up set_duration causing the seek to jump * should not save song positions>no_songs * cleaned up the 'Time - 0:0' messages 09 Apr 09 - Exit bug fixed * crash on exit fixed. Was trying to free something that wasn't malloc'ed 09 Apr 09 - Bug's Fixed * timer bug introduced in 0.22 * selecting a new playlist did not stop playing song and timer bug * time for songs with second durations < 10 being shown as 3:9 instead of 3:09 * error on exit 08 Apr 09 - Third Release - Added Feature * Changed location of icons to /usr/share/intone * Exiting when paused now saves song and seek position. On next start, playback start from where it was left. 07 Apr 09 - Second Release - Minor Big Fixes * Fixed Bug where selecting a song and playing it with the play button did not update the song_index. * Added icons for various lists. * Added fix for seeking. Patch by Marco Trevisan (Treviño). * Changed location of database to ~/.intone. * Added artwork for intone to ~/.intone/art/. * Fixed restoring of last vol setting. 05 Apr 09 - Version 0.20 (Alpha Release) intone-0.77+git20120308/README000066400000000000000000000002771172615526600152430ustar00rootroot00000000000000About: ------ Intone is an mplayer frontend for freesmartphone.org based mobile devices. Requirements: ------------- elementary evas ecore e-dbus dbus sqlite3 libvorbisfile libid3 intone-0.77+git20120308/autogen.sh000077500000000000000000000001001172615526600163450ustar00rootroot00000000000000#!/bin/sh autoreconf --force --install --symlink --warnings=all intone-0.77+git20120308/configure.ac000066400000000000000000000010141172615526600166370ustar00rootroot00000000000000AC_INIT([intone],[0.70]) AM_INIT_AUTOMAKE AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS([config.h]) AC_PROG_CC AC_HEADER_STDC AC_CHECK_HEADERS(id3.h, [have_id3_h=yes], [have_id3_h=no]) AC_CHECK_LIB(id3, ID3Tag_New, [have_id3lib=yes], [have_id3lib=no]) if test $have_id3lib = no -o $have_id3_h = no ; then AC_MSG_ERROR([Cannot find ID3 tag reading library]) fi PKG_CHECK_MODULES(INTONE, [elementary edbus dbus-1 evas ecore sqlite3 vorbisfile]) AC_CONFIG_FILES([ Makefile src/Makefile resources/Makefile ]) AC_OUTPUT intone-0.77+git20120308/resources/000077500000000000000000000000001172615526600163675ustar00rootroot00000000000000intone-0.77+git20120308/resources/Makefile.am000066400000000000000000000013241172615526600204230ustar00rootroot00000000000000MAINTAINERCLEANFILES = Makefile.in intonedir = $(pkgdatadir) dist_intone_DATA = \ album.png \ album-shuffle.png \ album_view.png \ artist-shuffle.png \ bluetooth.png \ folder.png \ generic.png \ lyrics_view.png \ next.png \ no-album-art.png \ no-bluetooth.png \ no-random.png \ no-repeat.png \ no-shuffle.png \ pause.png \ playlist.png \ playlist_view.png \ play.png \ prev.png \ random.png \ record.png \ repeat.png \ seek-back.png \ seek-fwd.png \ settings.png \ shuffle.png \ song.png \ song-shuffle.png \ temp.png \ user-home.png dist_man_MANS = intone.1 dist_icon_DATA = intone.png icondir = $(datarootdir)/pixmaps dist_menu_DATA = intone.desktop menudir = $(datarootdir)/applications intone-0.77+git20120308/resources/album-shuffle.png000066400000000000000000000014121172615526600216250ustar00rootroot00000000000000PNG  IHDR88;sRGBbKGDC pHYs  tIME / n%tEXtCommentCreated with GIMPWeIDATh;hQ j16J*su-,-mIX FRD۠&Yٜzݝfѹٙ=9"`0rE+oH| 0 |z Jn"r W 诨fͱ<-yKk 0fYq54pF@]s %=<w|V)^ n U?p/ ]@_D^;F m |l\/)7~|H&RELdUE)nj9>念)+&iN s> &[aȻ6}dVm( j?K5n5IoLa}j,?lt6/'stB`&+:g*2pUϳuM|7z@XXZ$7{@;`M1 {0LQzIq udjbx*-DF; !\"1 ,k,Y {iw@Iu}{!"g+LXMVt~`y 'AE-~.IENDB`intone-0.77+git20120308/resources/album.png000066400000000000000000000107571172615526600202070ustar00rootroot00000000000000PNG  IHDRPPsRGBbKGD pHYs B(xtIME9oIDATx[Yyԭ{{f޵1A ͒Q&@яxsλi9瞱~1?|Lw&sK|ͼbhj)OqCYބsܧV>sRqG<;6&yS}_\\'< |xF2)qp}N3pB[JjjvmN;e^\:"FAZKGks[l}ɓ\tI,--ٳٳgv9~GxRΞx@rep2mv~~.hϴ,,fF @`LE[,.RJa%cVVV֖0ǀ1;A,9rWGw#i'9+=DL͆ά00=ݡhSZ8KiDutW$iTu&w ;%Fkh4o;Eb;v k-B}-r}zijV,VtfC-|]Ǥ$jDuIӫ?OvI><@rJ))vqo š G_7t?v guKI ]pZ8K-PӨ#f8H @LMMjD$I?F**,$aТvEM-P gF8z.k+k #\LM=+pZ[@ƘS<.iqeeV%zޫ"y @o /SS;SS! Q8sxnzyyYEkܩNeC5qz`Upk%ݶQt s0& OTux~ kk,^Zcy第q2R mh!ū3R oW>ռJ)>ZZ#Vla 73U;Eֻk=*K+WX[[BkEԩDQ99:ͽ<`s(lnyޖcZk>ϻ8^h'1&B1J҅HvąAsHcTxuX  \FJ9R-0D!ی!Nv nkv̈́"*ne^*[.ދ"dNcjZ-1pX5GN ZY[ۓF#t]8.uc G۵ۮ yYR'xC{E..#wu1lqaH^,SN>Bӿ[U/Rbj[ZO)bu(KVWiQxGci|B#%WzAz[)kd%YgNJL7 i7qVD9$e 9)C=8gPү,G|"jxyY4$!*2oVlkCz4!B@ztgRe LWanq?urΡ&IFQisldXw[dB0R9(u 0MӁy(4Mk-=kԲ.m0La%c%=?0LV3h3ʕ 2DO M0^bf9s򝬮-J8!]3g"qL З(cn!h ]|+w-˥ﲾq.,$bL6 n}* g#<{D +pTp˅ZFELMMh42Cy s+k@nB~fɽ_^ QZ*0UR%N׷<`i Eoмxl|78\i\@cMӔ$I81Ơ\=Ě[ P8]F2WGJ $h3Uj;)}f[` p~]7/Vf&ma BM9᜛NӴh y4!Z^(믢{ 8wbˆg?lDJDox79pzVYJrzE'AZ!'*+{t ܕ}4Ɛ b8frƹZ :ucv%q<!ex f%oAH y҄2sYI\Y[JMO6݈ ;0 AM0uNۄeZ \\ߜ>9!94BЈz\@9\iR3kb3 \9;+к[m ,?b PJ%(!d.3/B \qى!FQ62}H[\ ؃^mMPBn+]_UY8DŽ|w#1ZkblBQڕmn D LY*)S(۹|1 VP cDH)i4^tY%Qv[%іfBd<gEVD9@č@ 3$IHGX:WQXg!<*&mVV+7@Ⱦ#MSjZRcw^""\G[2DpÉ~+Ne+&Kh4P~ҎTCBn?{`΅J4~y'Fz b:Az(mQfhO)J/y:Y9n/WҎ$U8!'>9'>>qY}&/w#;\ZÑ(H՜+1OȰ|Ci6\G=Xt7֑jGg]%"N{=C JnؼS+ .M7jY,Jky^v`VQf!qXRM{9yC0HgF΢H&W:'քa";Z/0JII1vJiޑLMMf^en'Y/'ذS._ɞqaֽ=q'?,XTVcb2tks t|gcyyӣivu4 as/Po/+w{?y>[yr?pc?ewV岊E^g*.w?7*ʇޮiGVFP "qpn"BJ*|kEc'vN&򙫞XϱMmRVSywܮ+ƎZ_uiNIz~WةM-&QvhvhvhvhvvJ IENDB`intone-0.77+git20120308/resources/album_view.png000066400000000000000000000003561172615526600212330ustar00rootroot00000000000000PNG  IHDR@@iqsRGB pHYs  tIME ,*AtEXtCommentCreated with GIMPW[IDATx @A}qɖ(J TE>m{[/ghhhhhhphh%l:ሼ>IENDB`intone-0.77+git20120308/resources/artist-shuffle.png000066400000000000000000000013771172615526600220450ustar00rootroot00000000000000PNG  IHDR88;sRGBbKGDC pHYs  tIME ,O8tEXtCommentCreated with GIMPWZIDATh혿kA# 61B QS+9TT, Q(Z$BP# 1 FG@h.7;n|_̼y;0 06 Ё-@ wDhJ@c"MDalz^?dY^ :pҁN׀`d+3gpBo>"thu g0bz@_p]Q減*eX'aKIENDB`intone-0.77+git20120308/resources/bluetooth.png000066400000000000000000000053751172615526600211140ustar00rootroot00000000000000PNG  IHDRPo{=GsRGBbKGD pHYs  tIME   }IDATxke\<7䀁1Q:Yd::e MaxУejjP4BzR.F^Ő2!RAD~ga{fw??k=kyN̨XVU` +Vp ^>1pe9yFMk@}C38/wfk\ˁR0Ub\z0g?'+307k>R<|5jF`= Y-Q`,ppJ "ׁJ%] \R*SnDU p.N'pP~*fQ1L'ܟM Y0\OdƈXDl7 0b8 {5; ][#5[o)tXn<]AϔN\+b+]^PV+6ړ#qZ/cߨ4Q[iL*cQ`җQNNZpJhAYnpqiqI)y-\DkREr|Z 30 VJp y6 N>x)JswXE}5Yhfo/3^a61:3cf̬;{1*3QJ'R 0O3{)of| 15,.+ւTT$&N!jq8E (HĻg6Q .>VĊg,Z;K-$O߿VYWH9if0fX8̾ofܣ̞7̬*o zf\G,̬:[ג,ʼJ+eff6̞Qdf.!lf?1}f6>3`fי91>g;WΌrJ P sśAa,۫ >\Zr|i\2  1]Eav0+%^(Bn8+`uNCfqR^_8v/p_ W| 87"W>ܭ|b߅m٭5)^'B(řƄvmo!ځ7H ~eX\"[ژxc4b [`1g`ƛ@Kq:=_whے/)Q_ky O7I;_ὉlFG:˔v(wۙu}*b:sW2s!շ0x-MYULہj1)3Z |?k|7^cx k1s$338Wh[Wr1Q3R[rMč" l>3_]> 0}:뷮йbL7pց+! %OP+ pV oG9i]ao'k 5į0p'ẚxri ݂  Nfc'=Ư/d S&~*)89 WƎr43= Ok, Nڿ@ g l4R fvY"*ҫ8Lktygq1U$A0hx.\+feV zqu@b]GJɹWSޒQJcEj_P5KS1խ]x_dVBx}Ƀ1o&'.'*9/Hz&.Y7=tijJ}6UӔ$Н>cK6gq2ңX%T`(Qn ob |@v W#[qJ4IʚBؕ'^|`1,}o'"+Vo*~Iҩk4ZՑU:qCDMͺEZ<2y螤SnmvbDބSda nY[DEXUfͼͥ6rpDŅpbY*A*=8D)KW~˥ 6du,x"qzipSCsRJͅr\WۧOܬoU;h׿YZAlN*[IENDB`intone-0.77+git20120308/resources/folder.png000066400000000000000000000056141172615526600203560ustar00rootroot00000000000000PNG  IHDRPPsRGBbKGD pHYs B(xtIME;6s IDATxϫ$Wǿ֭sdA]݅H! WAt!JHVӅH? DnqJP@_o3~tWWս㢪:~'>p{NUmmk[ֶGS~/~".+%"3ҥK|~z"r ^z6z z a'{h5W:j{gg~ٕ("bcč`"`y`G5}Q\~]ݺumM9Ȳ ^W4&AzR~ ?ʲX'O/_|~xevww*$8֚s\r &J qyx`oח :5ZZDxM8*R <#A$059Xn\)k->/+~ V`ֈxjR.A{pՂ1.\&1PJAk=TQ)0 "«*y?[,snuii^oպC}凡D$Z*@4WǸdY!< dTVPVƱ[ˮ¹R {Z-lmm{? p҇p/ŠuOveWLDPUp82<8K4+8s6YQi-j13<mWpӦ2Th\ޫ Cҏ^,8[yFv^S:C4$wg*x@ys`ZmcnU`B(c49:eZA#n54Ee[ ƘCi'FL}ĮeL7 ׇ s } QLYR+\$sߞ04үKى_-aIC)ugqVUy[666FY@h( X00,94SR6E%&/+OHJ n Za,Ywn@.\^n < zs Ð{mt]41Z ćr!rK溵HLD2*ܻkjЍ w( HN0:(8$ $A/BG =@c`AE'Bq PË4i'G&?e2gf8F1{ XÝ "E 3W`(8B`w@N4Vb.%"ds>X`Dn ƦH`nEr?`VNbppVnP3Ë1!1_l-KrE9)'7AߺR Zk O%=Ģ+'qr \ !ҜwK>4/[56L @!y9䶜Y`I`![.@\ `fDQ.'*P$'nR|J=ˎDhqucι L)6O^ @,@|e]롣'"cP|7% Bc0_^)c+R*jC| +""[wt:PQiHi,/D\+L7` UO+Gt4o0 o9 :wfen߾;w҃^{.@ӵY-_rͳ.ަ/$5s@񻟗xZR02΃pxu˼ϪŠL U8((aoyoc{㠦\hn~w*-S[Q-ҍUqF)AEtsQjTORMvHVp},󱰦 를0\1^&.5ŃzY_nL!YC{8whWZֶmmk[} v]EIENDB`intone-0.77+git20120308/resources/generic.png000066400000000000000000000042061172615526600205130ustar00rootroot00000000000000PNG  IHDRPPsRGBbKGD pHYs B(xtIME34J~IDATx\oF/[E2lvA$_snu]$s_OȐrl eQ=".:Dq/RNp%[[[E!2y9![e,!;(@)]|ma.(Z|0 ?Eo իW?ڶytgg`I)]|`~i_CV_J)>Kw!# eY?;xgsI*<,8&At"@YAAz2r])4Ibۮ8::R o eL...ppp۶3ct:_SA6u٧Glooc0`{{{f vKHZFljm80 SS9q|||͡2Nd%* Q E**ITUi@2 H}k)nEFiEb4R#͛ 9yQ"^OdaP-MV+X =wSMtFμ\$( z~mJ'R0yLco$)MʉX_]](eY멵oY:(ӄ2s68~5?~lB?ۤ ޿d`Qfmmm5={sJP(4 >|[>/|2sh4fԚy!$@ !zNs` +&s&B@>y'h~ 9qj;4Ddҋgsom3gsi^'#v @qghv{nIENDB`intone-0.77+git20120308/resources/intone.1000066400000000000000000000011351172615526600177450ustar00rootroot00000000000000.TH INTONE 1 "July 31, 2009" .\" Please adjust this date whenever revising the manpage. .SH NAME intone \- elementary audio player .SH SYNOPSIS .B intone .SH DESCRIPTION intone is an elementary based mplayer audio frontend. It has been written for Openmoko Freerunner, but may be used with any phone using the Freesmartphone.org software stack with elementary. .SH OPTIONS intone takes no parameters. .SH AUTHOR intone was written by chaitanya chandel . .PP This manual page was written by Sebastian Reichel , for the Debian project (but may be used by others). intone-0.77+git20120308/resources/intone.desktop000066400000000000000000000003001172615526600212470ustar00rootroot00000000000000[Desktop Entry] Name=Intone GenericName=Music Player Comment=Simple music player for mobile devices Exec=intone Icon=intone Terminal=false Type=Application Categories=AudioVideo;Audio;Player; intone-0.77+git20120308/resources/intone.png000066400000000000000000000453531172615526600204030ustar00rootroot00000000000000PNG  IHDR>a pHYs   cHRMz%u0`:o_FJqIDATxw\g}/y3}f{ߕ겚%ےl 7 zK%B8F$(q)sh4FeXXX@6EXhZUlUH?L ( ,iiڟkYbK;DQDQg~P(P(Ʀ&l&t:9E|qm>Px'j_To-… BȲ?T*8F1:2I9KE;|47 ,zLX`%TÈhhGk[;:;;Ҋx"oKRHR(1:2IIsk7$Ǝ9S @)X(~F75P%˹-8##a1*I$"6-%U^  `@%X,VX+WyY; | H0 0&ZZZ>1&kb9 p!~X(| bG$ b%U}X3gp1 #ɀb}$2)n5 BjIa&@ )V4BdHT9Ԇ-!8.҂kb5H&K^,KR A=AINJ1 *_5}qAh,d2 II<$N8ȊI ILmgRG>G:=i[8!pDxX H,1SJd(PHRK3bk1X =+VbUWkB`E BUU00M0zz嫚"00 l6͘r0IB*Bx u?r">(N:B.9sNcfzc㣸|,chhhDsk+ZZ[J!&{B, E @% [&`LFGg6oނUj\.sg155eiar/565~4+ͥ_8 JPB!)kPD"HRJ~_ıcPUP$ c( 0>>\.H$ή.t@KK+6bXθ XA|?#8( A%ɊIRIJ\񴷷cXr`xh0LJ0 T۶#ύ$?BP*%bFT XvȔ?T,"JdB0;3A\0t: I֎UWxe+gao" >ff 1$I466.Ibn0LBb رM8t'G6c a Ltvv눢_ssssk!>$A jO=iHLl?p,FGGQFѳbzWESK $U+ww8[%^iᅵs8N<GKk+ ˲EQqUض}{M\T*ĉ|i`&d&w\s[[[^* |܃oq|EQPPSOOO?;dYc(pybgΜ(4ME$Ŋf:74abB ?+_밲2e0c߫=o;pShooǚ`rahk={\pG~& h4iqbRuu=w~ }}}R?=9Çbe(5cuPd&e^k ᗣ z'jt]G8uӳBm c׮] n#xa;%HL*ڽ ?gjbBL_׿ٙΞƉܢ&lٶMVs'!TJZ#b{]F6M&U7#4Mפعk֮ EFFpA`nutts9c!d2 -G8qw}(KPB!ȲRCO> ]{޻z 6lYV^;i e z* iR޹-- JsM7c˖-5𡃠&Ћ^tKbӡfl6\6èohTEO>4!+ E ?ssiPJ!+ ڼ==+\5[Ke j ga C;vw5LnBp4~lkw=t@cc/~KoRt@[8[,G6wBe I7ַܤ(GA.!D;mmn,M|aܲF2 N 9$Y:9 n&@BZihhjjkr\iMm YAT5M[d*l@y)s]G~ U-vRދ ! Kް/k44m8{ [ ;[ZZqkD`_A@bTx>(;i Ml9s FG8{L5kd'N|n!IePIZޱ\Uag78aP"D8qc7iV(?߇pCֶvl~5cĉ=D%xן ~wZeE>PdΝ[E,Eq|.\zO$=!Q 44O>&jZZZyVPÿbr/}L$8і RO,=UΞƓODS055U-زu+ ]$1\<3cvÒ&ABl s&407M{ '&'. ؄lm Vj\\ s;܃qg  ~5+͡T/8qG: EQ&Uq&ttvA5HsgM: dyуr;UB ;L<8v H1̧0MB lڼOc "@Tб ?cR/cxS*QÇ dpA;s!%IPRK8yDյ#?RBB@U#G*5 Kj4WٿqDsΞ?O#PI8q  -Bd?Cx_ds}@a#@c-@_ax?裘t JHc2Y  T5Lbm0tc}ŋo Bn8KI.iIa,uTuIS6}]'C155ۭ]x&UWU (~3㕘/~?CPUx(Vɸxa3U?aƍhmk렔ԉf)]\*4M݅|8IxLO~˗/CQ~ 0M=+Vف;NZ-*H}T<6I?+ 3Ug~jU}BgJ)ޱEKy|-Iˮd`W?/^E pz !উ=] IVgltSuuXr%t]!A, uf8U) #v,L߇P0?7}eonnA"t*P 9>V_C{[{SOR](bjIAf#),˸xJrҳ^S,܃rn{ vl,n.o;{5Ce`C~G䜼'kq4c5o3oPKE}eOO$hZ%1 bZ)dBp'P* uhkk+aοϣX(ϣσRjR JTT)VH8RJ%55RUU7F1;&s^iX?u$&''dcw !2˶3@U9aΛT_9dY;n׽GM}I`jc&/ڀoI!A LRE\D J% oR5 R R c%F9qlMPСTD%9 19G*%˫|fV([ŷ6nڈ}{ ʓL@!KUH%9W:2aTzi/Us=sL!19LOޭU*%A:\WPg%&<}tݪJZXq/bO[VJr kvb&AٳJ( B&2::a:!46~S6C.rc(Mj BU%LLL@'t<րdp%$>$kMTM,B у/SD94jQ+X= ">k*HA*3Nô;kڟFTJVMǒ41>:^h45T瓂'?緵ؘ[Py|HXJ 0&355auead"m3@ Hw @T,&'&vY(TMa8×ϻ0o6d0UÑ R}ss׿}eQ"#P EL]u)Y$0A)EXnw$;D"T]=87aXN5da[XUGPPSPU%hp^ZS~#^q_<1DPRϵ*M5M7 } MZqy9G_ )a( U>QkK s󻣱hXDIUwX1-G(`fZLMN'BP-+? >ke Ot>[$w?)78s4LtMe̠yLc O/Pu_322b`Kh6aH / )cY4fllԪ;t]CzvʾS@bL5 ݜH/?7}`5;q!\x1[3'Q],p/Mrq$ӳYfklhcV+ 팱.M0n6CQ(f,H8jZX&7sg?~7ԄOTp_XTdZ3_T^UP~ݰKֲ-BizU>&Lڎ,mT}:~ 56Ub,,UԜhϞV UWnߟ_8wڍ{=|ӟ8arYE,QHh5A$sD}pg%waU`4ki6✃nEƭX¼W^XXpSèT> 4=<,Rtt_- y_~>Kc8skB:]@MG?/!|y=iDp]ת1H+.^ʊ , bl.ɔy9Ib֮X#QTYQ۷X7~LX~!AG?+_*;{CCAckFA@`z6 USݱ8WK"pGHjaOheT Ԟ],deYXz "nOg00ȶv|SƝ~7nĉcGqex5%/jk~>!LjI8D V&%`V]6ka6IY7nq+3 K^hUUyV|GqQ,,,h2ov@/ߧ#Y:%4pB$u BRJZ)N8HWHTP xK1DYno6TtbBt3я5r,Ξ9p%"kbgJHPck8v!)iT4\5'y*q+@)\68Z HR9 Ԭ"\]{Ǜ6`hpoH鲉+`KxX uMwg#Yi+onOi2M3|~Є/Ml0 c]XT0AYy-P J|4, OW{k ĥqwrYʯԲvtQf 쵺 !d r Ml~pgMt"'[ѫR;uI1tl== >/ }Ζ4G|L!zz iJIYP!@U M)/%! <9ڞ|Nfq*oK8Utǎkp?' J^yَ>[> @z)Sg3*.ހw;H5ZD,h rf~ 8LRM5{VU~`O3x;qcY!X;}e.O^>Ġ>8 D+ܫmc$HLNasa2Xϑ:%\Xx~!SXc5l6IX W\tvtqӀGW z^jrJgܬ8/FUk&1wcMZ謂؞2F Hg'bRh$b};w`6=naϨT~b D㎦MTt^F|ap$:Re@B`F$/k\u66S&c"\fA Wsn1޽Ae-a(V 8E=nʗq|;f:܄a>ϫs) 3BD]' (לH ]sN4#g:$0&tƼYA bm7pYjha!v9VY",.f51%qG}C#֭` 6 \~x^3sEIH8b]C먥 ðʬ!a daMvG T8{.m^~{*K@/Q<3rQ%x׿< dE5@ h GSRP$X<^n\"D#D-- D]d*W,,|]]ֲLӄYyK=M {_/=FHRZ9 gZ4L9F@F]׫$%! Yse)E,s0-hX2qWlCHHDpN8QgYeQXr`T4vFGGمֶE|'ը. | SY"PIfyV$]b&4| SF/,٥3XeO_~&vʌQ9vWg^@Gл"&j@$ZY{/葧Ҋփs^IxJ=YG"7LmG"PK%k\e1Ha57`an@}C;3j@4Z&pAx#O=FxOD,aR y l7]Xs5*#᫷}'Xv=A9+sKx ik5Lsy&Vf3&TU✣T,"VV65ahp\p7 bǺPRKHrO|J'"R;M@7@E&ê`jagA /@5ezj _}8Xr onO-Uu5Ak|TͯWj(b 8 cV  R 1!DR:$W5@[[`qks}Cr##`AS5b׾RU~\L:7 .-q0]1q\' {#(w_fffnr὏e+|9nr$ XݲJ֜KϡX(PXJl1IB$>^ v!"/\!Ct!;(;‘j=/|nh[r蜥y$M!,+X_K;wmmXzkNA޾GyT!(%(?:z׬FssU@H˗'`:$ƐL&G&#:b!_[ t1&X$x9cg*+b *kxʶ3(M ;w?cFc8s>/>g6|0LΑ$xDK YkCx`Jd0ulظXԍ||FGG4Q_pQcAÔRsST bq| YсYp x [* DЛsM< >A9QjߤO_Gz|%!bll߼ɏ"+XջNxzB~E7O@KW/ Ⱦmc:ފ$aĄ54Kf2`@ EX,z9f3 +W铧G]];:p@UUhLB\!qa<?#FOm Fcdp·|J?"4ޱ"j.AJB.WlذBP3==t:&z{W?H&p- vc.]3˪k *7ం+D.xk*'4]GWW7vQ+Ȉl`T HKbUH$֨Juv>uҲsB3.*-^f W2|๠s(cPIB44vm?irtuu[jJ¢d/C|Tn(!9 LF<565"Z0)E"vznx+WiZkezWF=bvWd~5$'Pvaq?wދztvtZRoc-zp^e؊@;=]FՈ {_Ybo&^~0t ,3K}ӧNj؛L&G aJ(ud!XQ@-13[=tp&k5X ;v^P4 ߏT߯RPe,Ňg @ϊl>'L o'xqS[뀿$~REE9b\7?Ty7c'Ib` *dž/ggf^LM]F{{[vvv㗠nێ'=9HP( [q2\FWWyAJ(bnC,8{4[8$)Xʕj%/h1t형}~'>\"+2^7Dn'C."H&Sk֬1[-Du͂r Mi<2J`˖v6nD>+W&C*b|Ln"J!ɟX4)|_>~p1tuu.UgW#j;f W{֯KkI0z;v^U%`ac`]ӱTl||,(!g._(+M8d3z5Z03=]qupH`P#pd4A<?}`.< f*v& _ ~LC‡;97(!Rv۞? gNƥK6 o466VD?Tr큵3@QB֯&2$a]&J/}nf1 Ǐ%|(qyb߹LA{GX%6=|ߵ(A/JTyWi!⦛cNQ}ွBؿְ߮jժ}׬/I̚fT*(QWWG(wzFk5hi4 \wz{WC4B* żvZ*Cr6^MD]hoR}$Q?Akj Ѭ0 jU'~J PJquׂR]QΫXELw[כ #`n].>[:aFi c#'|UEkVR@5pH$Zex׿t]g;:,dP,+F?Pe2 h]Xf K_anxэ.25HWx.n|پF z/%El?:E6mJߠ?G}ᗾeo 0">u4{۲u+VBC]GSK3 `ijZ_qbNz~ֲ X,vy t9k]?=hkkUÊU+H&V4@ <|?Pi/^}Z*"fV⃴5 s^YE6V{|/>P8Zž=߶mu[[/y?8J+uLVQBT+hkoeE!چr`A5.Z.X," cµUxb յ"(:Mxp5͚7RD"QU P Cq[ ^ N\G>H:VLquס#6=أreH#/_&&.!laDcqk7P"*X1ȕE~ł }@.J%DQ^j'mD"_S &ޗ}*hCMWb;}L&'_,,L\G033o2Ξ>'- 񸻉̡Z%3`S$8Y6о#?@T-h'>Oص{'T*᫷݆!( ]淾=vaW4/QvH$-ɷIWP(vLOOX,AZ3wua! q*՚ M*A%UrD|/¡J{zNwR3!y6, !C ]C*Un*}&&&p)p(';߾TΘ4[C*HaOAFH4K0q0P,ۋ?|׼ Daw@$F7746^|{Gchpv,믿Ḿ+ 8s4&\uD(dY $ʮgOj1a(Khjn›~-x߂fE7jpн]{Ʃ'[6]moo|6Yagt ?vG% 0d]wgE\hfo Gï~?`b|:_E'a.]$#TCEU96V5.‘bNmjj u'.^p(bʕw>P p o1O 1 6oق[5lwP@*wC(,}xWmfTjy:ueO,9Wx^UVAu{I#q#X,;ӧN} Pd%UEgw#z{n4i La֭长nxZڠkou#њs_ag?7QhvgݺujUo!JP(<R/?w{>o]ӐH$puӳO159Qk T$|%;us\R&GϊzΪrMTc~nAߖ(du [4Q7tp#YeYF[p3lX݆npv,{K)pj&J]ɔe6%sg/(*!g;3i^( ¡BpM6(wx|^LMMAQ0Y9uֶ94 x5t| nh3LϦ7K'OGy[ uuu~Sdb% E IiZ&..wZN%;@ )T 3Y!(! ZʮCcGb{111BM7YngŢi;xASSޱ;w|1#8{ VZMB[{K)(:ai7u08 @᭢q)k>sőÇSOazj:sM]ekaÆOz Ÿ)!՟ B˓X*S0 gNs}hmkúr*j`浘B 4M9}f ۄ7 kVwOσk֮Mڧi[1۸ tH4/gftdtB>H`|| ###cDojtvuUM3mTU(Μ9>LMM49̬@Hlظs? Gh4=.c@Ww%;kddssk8);w}!=DCCsf;u]BͱQ `EͦۓdaJ&s׬+ BH =/y^GpI֮]՟x;+JR)J"180$b1455 hllB<C$]~(J%Ybzj /_KQ,ѹ(Dfh8r[onn\UA7 H- tճ3o_U*rDkBx6 4 Ȳ<Ʀ/buPxĥK7s\vik XP#azj*6qns8G!܄|@25H&>k! *Q\4Mwf?3vc`<V}]}… k Ӹ6< upNa[y{`$u.#ؒLaR p8<p.UWwDfs4 PpI^(A`U()Щx)YDH&h}rj{~~;|Rk&i7 3b:3 CB*ID%]Qu~~.C4>M+[mc 됞qޭ|!^JNIENDB`intone-0.77+git20120308/resources/lyrics_view.png000066400000000000000000000004341172615526600214350ustar00rootroot00000000000000PNG  IHDR@@iqsRGBbKGDC pHYs  tIMEEtEXtCommentCreated with GIMPWwIDATxՁ AjXq 6njdf~YG.=Kg~@# @l[ -`@e|<3`,2\IENDB`intone-0.77+git20120308/resources/next.png000066400000000000000000000105361172615526600200600ustar00rootroot00000000000000PNG  IHDRPPsRGBbKGD pHYs B(xtIME"^pIDATxZkT~9}t 3 pqf@tR[lF&0ef6U^0ɖV nLU61 hkQD.27[w>o3 UNL?}y|  @ @ @d&!_oӜgH8_TԤ(JtO?N&1ع|ݼQΫȜMOh݋W'pxw^)3zujdKko;1s4iHeҋɧoNJ+$H5MRr_\.^0m^` Oz7q qȴVUU2$lڸ GE[;̿iv{{4gqSi^6{?߸q#~v:w^MͭMO?v!8e-q^{ݵXՓsoBUUIi'cݝٻ KՐoe}]]]+cX,c;D]'z{wK;-Ztƶ"/JUUe{#C879 }s\aѩʏf'ٴqbuDbٳgpĬ%&W~ 3'xXٮ[[ hhnnnaT,B@ %􂥩>b @B!kv@N0nܸs»dضq+)z }>)oÌ侎N$aXydIrE-\A&X7wn۞9sюs.G0RJdi _9ef_KKˍEf/_f[Md .S\0fڷƍFgky[Zt]R4MV/\q"o7Ҕ皚F"V_}ʕ+C_-pM 22 B*`y(!wN&-]]]3֮]j@Ʀcxt+o8'cwk. -7pô ,puBJ@(!5ʌs^vBWWJ ? 恵[#%{MLel伪*hR5cu]VE.Bop8\K TŃ"meQ_uG "hpDߪzi[neՓFuYZxt&lάƢm\猰D8nɕ+WNjk_|N\C15wP(!c_B+ k]@Lql,[z vz1J7B"=-jYzuC/%۶Τ`-;w@.0FW!q@h4j\RYRR_<-L)R U"Jx,8ηסw'-]rWU7 Ml]zulL0XZx%\~f.8cG/.] '{W8ׯB! _WI-̧%aD#("aqlds&PLG~L޻-N?O@ MIF׮]d2C\ׂ+J W.9 {?Yثi(ԄM=j9*ʕ@˥ Z-+U[V\kI7~Yr;[@^{4M3뛽 `_`aB)J8q`;6,ۂeY(XyysHg0DZV!ef1d3LrYsǑ/Pò (XyX˱`6lFǹ/0c եr~Pr Nzv+۲.u†aLhe+/5DB w<"O?@~>lҖɤwd=L?Sy+?9RJH"A$g <x>-Ilr]nHitnN,_C6g4Ș29s?e[\[6o!ko_ FjJ?[1FMRZz$H F+xqrW,%ݤR lOeaDZึ]1V5H )Ws הh?5Oy.䴼2kqYe@Um "//_VuMJ) = ]3 ǎ⩟oiE=w +K4 l*--(<8x@UPUs*$=UPB # J(FFѻYy @zD}7JWP:`8[O|2r! |[9dr)piՒ]J\.%k_AC s۶p};+xqF-;/ W˯x =6w:{v\p`0 BXIDd:="J(c2B UQ!ĉDZcdzE*{"uu#O8qF\{YyO:;f$"%nktf)+78 efNY{# "T ) %d lDhmm;D)u ޛm۶Ap׶/|A8qD6Ϛw1ڶ+^ dB4 !i j\pSVunQG)A EHxؿ/!PH&2݉\4}nZ1XOO'5M҂x#a`B1&MB2J'ޖJ#CqxPB(ԾdR|0Y½$ޏ/=^U ͨoxyB`5kJ(e_'!2P@EQjo"8Nl8(^xQ0U t&WG' !t o?!Ƙzzz2PU-\+o&Ư_SRڟH&6\}U!ι+H|͙]וIwLrH:J zc cț꫿@o^`6ι庮ymB܋H+"3Zxx^= 5ؼmsRh4|>_l"&$!N@EQ$dGҪH#jPxfֳMC2pSӬeYLfRN@.`s^;o-YBkjlzx֬9gDZfΜ9YgaZ@u?J E@UUk0*Á:Pۦon?pPB .>$p-JY&eXW86Qݳw4!6,]("mWLBJ _Ju&T9羕(!0Qp86[-^ԽMUUq78]/pAЍ]ݵ-[%K4B2\k 2]ʺa,`\n(klh|,!✏jTTl*x `H6?qɼPH 5pB+ # ɚ@]A/™Lr9 ̜93dKض~t.T2&,!$ @ @ @gb0WՐIENDB`intone-0.77+git20120308/resources/no-album-art.png000066400000000000000000000503231172615526600213760ustar00rootroot00000000000000PNG  IHDR#usRGB pHYs  tIME l֕ IDATxi$q&U `H9P4ՎΗ5 %Mkc&5Ί)ZH @_U!򈌌̪~2X]oU~<8rRZ+" "՛Ɵ  _n~ 6>lgoڗ^DyؾS3s{nC"R_sz?iKH#ns"Xg_TFD$I,ܹ1Zig ︕<>Nj_@ ׿׾(~ akNS?{߷3g񨌺|Ů϶js͍czDD<ύ1Zo3;M'u'[u]o'tӾ*}>p%=vɣ_=ij8ou ͆x߮uعXVUEepjOy0n^}z#F}߯xXm픒6|>D;mw'rfC]zGѩʾt}jtY?rVJifβsrr|ttdV;wyVuw|4;~gPm o2εmlfkt*,6tA߭ zVnRb?sT:˲Sc[f.96Q=S3zv~osSGφK;o-7pc&Ib(,Dc9>>.O:Rq{J9Dukbu~=6>k>diwo^7Tϥ3fey[S ףګ~L5]__;&sgY欳'leJ nS8~`yQ>GgB?mKR>?o+v|v34B|rrT< y0v{C\@WD[O̳o}U{ڂاw_-}X=-KV894Pٓ18{=fN |hssKKÿ($'O!{~]nPߚ{/Up3ul pi2) mq{^K1PFP?ڟ7bҢnp3[)v:e !GUtGBCdhvt ]oW=ND|VgUSPZ=<%#x.4[BѤ}D/}lBO3|NMՌ$ĸѷꈛ~_=7 D:7271 NG<`bD.g&7c\\xd GH֗0 ,HC@ӌfAU1jF:ޘx~|\\~gvx5sYtV҆Qgm)af*Eغ}޶]n_ sFAIjjSI!a7^Wȃ>`+d:1Ayqzzjp}Ud?!T="uCDgϵ;3B0rȜս؆"1YYl"ynQ =+Tq³4*%Ft~"Ws; ]m~tJoLbfUuֺ!! ::a1IXch¬cÞjhe<R4*fQLiY}Xk MJL.}(2|c8L=܏R?ry;أGmm~!N+uGȍED$Tu D #lE,+$Zݹs޽{w9;;KՕ< u⑇{bQ Jm^cyD)0Ea)eP!RӱuDTJ1\.߿~$Ig 4ADv&U = LjNgz„V#|^}3}eD$R5g݁tz<>::J֭["rtto>xJ(\T*" TtW;nQ.WE qiXTϝcb>FW``WykXA @A@F T`8$IDT/ҳW_}߿ꫯk5if6 b*2qQP)uDDP"ZP*OOھleީ.+{˨/1R0Ie "aͥ2sY䲨,cVEZ k2(JH"16=Z.KT$nz7ܽ|W^uc~֖ IDEXI9 BRZA eLAj]X;Ǩ~i[T?XȲ kT7ݱ>sGM5kNjo^J)(4IȉRCY^Yayz}5%b<>==}[ݾ}Gwܹ[NNzc\B HDqS@FXֈ75. &aFgN{ŕ!6:"P x[7^3IRJ)ٺR@DDZ!Zg}[b.Af`v!|3m1Ȯ9rxyr`GiQpo{b6O5>TJeqMe:99!"t&gʝ;w|[n({^"TLEQ(@Mu S+QJ#k# % h30GGDt8 gG2C F gfP":u{^bqzzb8RJ]__cֹiY`1DK.È$ wv D%1#fKݐ[="lQ;](!BxW*gGѧwރn߾}|vo}_w6 k7#9h *l$ZkZwN[G"MQ$WbPDOKܳdCC0Q|Ѐ9*=qgjg)ɫE3&\־YkDQs(yᤓ $S@π>}T. ? \=PmHغ%"P./EtW3ҝ+{ò2sQ&fM!-勃{O XPAX=55:Ǧ-c4 0nBF4pu$:#0ÏaO&m芄8qg͜kv > 2b9a ފleF@6.YPjYxBFmNYOL"`LXeѷplfev:: "rpݓFD@ 3uqW Q9w-sh݈莝:!:P}_O] Cب1ؖ1W]GJ/v~U&壘2CPDI|#P=t{l3J: XAhtmuB RmY ?r݃>2ye,\oTVTM0K?k̪zs@ 32$qvYD\՞8RvHND $a&‽A(p0Jx`CBjuxNT::0 Y`1֐CdFћ2p ')? :ѥMۅ.ikiyaԈ;N2҉_TWSуB ߨ+ld:$mI3O<0vZz |Tw5owtIlّ ! ` n8H7l.;9*5- m04fpAF:=)1K6%~^,E&ue-;yø͵j]@: (~0 DEjMUwQs[كu4Cls;*ØC:`C^(feXgaO;|L|jy^U2Ipp |4"ι(*plFy@սQ&%,7^;AhBɈ93"b@ďj> z`(i{c7bjnV)p3 "`GHͳZkhtwu!4ptu_s@(x.ZHyȫIV[C.zC(D\kECZi~YSPRCuf9A$ycg$"0ʼnA 7H']"h:>N~Rq<3VA0ITNv}$ܫj{ iqve!0fڹv aadS@'_7;n;!*7R%?E$\YJq",lY6^DdSQtXqሐBw f$@'LtӓC/-aʗ.~F:_h0˳R"W " DǾWVTYAHvUj(VSRGͧ ?@`a(uv')!9A}-Cn΋9'HXGanƊ,ˮW:ы7||T&*K즿R"3RzAUʟV4z_`*oȻf,@CW.ZrNT)e]VY]^^fYvqӧ6ww.ONXPJ!†{@>cȱ4 uGPcpDlgVp/ł  ye!tYSdǏ?~|uuqu)Zl(6|ZnTl޽;'ȲGpg"}`,3Ԧq tl瞟 Z(j^o+G;G~sLbrs.NN%3Y^":w}lͅ)*@!X[D&ˍYd3rGͪϪ2/b~Y@(\4[u`5/eCڛNcթK+ &E)>ѓ/=yzy}uyz:_Wr0*"$V(V XBԉڸ`;х ÝIIڭ-yjBͻVF7tPX C968x`@ u"n>0VBYG?..W<75b@ <>J4R"0$f&PZk$+e6O\Vu;l-_m#\]- 0E:gRO;qg|x)EcPcدyn ^a Ngq d0rWML\j1 rXE(T*dGYQW0 9W\WB.~a.Pf\7<-m&KէZx ==8Ffqq )ԈK-TGX}YLLu_(=cɛ c/:vnպkGxsNꛡN>Y&,!đ%J'@9+Mo[.8ʃ>;^gׂ:d|J?^_ogKoy T*]:VlUy܆BTUs݃g8x]4?'HzicqGxOx-ݯ8]U-ND '&m㫎;A0;bGȈ2s}.d͈nM\dfjNCqɼsC`5Xk]SVx60:Ȏ]`}U3; p) b][4pC 펏u+qu? XkSDf  UH VbM}cwN8FRX0"bɺJ>#$މj.uLoa dJ)F @ }@  2VWujv$s>t$ύ^#~r"QJzhnmu7z`=b~>p}+ +fjOX [$D,hZP}h-MܾKw B!2Ӕ鴜}ll@D/:ٚ<< 1eYw]uFS虷TB:H:Cv Ո %}vٛ#)KOCyyO#'!cv<N6uH~!]Bd$KjK19Jǂ!U𿇮U%5|yAv_йy]cƂN )pe2p 9j GN!بÁ|6Y/El̐j:mW>X7p Dv{|r_/%O?pW8ځĮwn{Lh[K`^"$^6U~'PϢAlnTx&2.ò݇` 5*eUhHQhR{7>AW`5jf^)[&j;PA>a\A k.b:0 m-IzXyv}_ޮ"n`'5$Ib72~oأJ{`ĺO]Wӗ7kz _ zs7GRM6U0sIT X^ձhi`Zx` r#:$Z>6|ᇚn?ϻFѱwz6xtRul@AlR`S7I~ӻ"nSaLyx5b ࢑g/%gţr)Uu*iH:^!c0u@LTKOvܨm3(R [-;d"2V>p/(PoB5 wzkRahkkh&$ 224%agtOi3w~#Oy4fƣ'5.m%O <;aO6WLaIS|$IQ 5Տy "[\&X?-#0L]0HbT}Xxxg6vuo$q>BtKeυ/UwW6|;[w @ BI`B{@FLz'GP! [h"@^+.g쐰8xiDsubJ-g7u}哋@huO z@ =w;l ~k7uPG" fmP#"NjهW;FiqH<l[fb1>cp ARi}-c4;m'x^ݘhe<Or4!Ě!nw }5 p$;fdL]LJ;Yo?~ 8|/$D\kj=;%pS"n>v$ee\Aq@b*r iO ;ܐ+:^7@#F;& i t:S @%,6̌l(vd;"?̘uqP;[Zprt]q1/fUy.শ:uL($ RPĊ*3RD ,TJ1ƭ!9Q kJI Ÿ D5'*3:YdƠɓD5"Q 0VI*ӽqdwgҠ@e:`5;S+{e!mU\ۋ ` "@jՆo,'ryblhQ2+:9D,VyU rZELQ@ "kvz'd@ ⒃\JߣG#ľz:BD}KWٚ@<ϯ]iqZyMHVtcδtpޔ>QtBX Q8.d4Um}H&%I6艳>azM*D1~靻gW"$I.Rֲ" -2$BbD5 vlW">[NR{n`pNwH:nK]PR;r}ަX={jtQZpk;6fB#`Dί4-@%BXkTY@zY z+fVcug4F^5]; lk=Py7S80t }JD~?z򪰢TbMU\[kJ.I"$̼.L`AA7ӚDQ+S~K)͍]B@uCWn]DXsnGRD$;NYUYX^Ep"Vͅ%EQhED/G?kţgѱXc,#*cX QuU\|R/Q [v6l,k0c `|yL\0zz = MT?c0=!c1[k+RVT`S%0zZ%Ir<煅Uztb,4icӣED[/F1*ҋv㦆tJ{<>j=\#"YBPٺ 4]B爘r`r9|SYkQk7ApdS}H_]G?-On=yv΢J.",|֜rv%c̳ͦ8;;WYWӮ: )UQlCa?}WnzѐeVN /,(q*R(AY+Z';3EA*T뫯/^$Yvq`Aʢ BȍosM걱PO=;aT5!*"b #"jE, k YfDMWGW?3Ƈ"607νg<9EX^3Dԋz*l :-h&t5ZF4Xz蛮&Fw>; 1- ty@H_su_}i,pփx5[A~xY -o +Hz[k#kX$"Rw;z-3iC] ȎGLǟsRd/`5\:)5`Po~xwy7$) J)A2YZ/믽$gJD'%iT`?."Mno|osquEjQ0@.EM! sQ竑%%"!  CCΈ*3&HF~rn }nLVg$I-DDQYdTZk@eXXH$bQ1ʈfk hERWי Y[YXٻ$ob@y ݄0??ܔ0(u [` LȰ)yhzu :/r5f"̉RzE6P`]&W7y.v򾗽cY g_i,K2EЏ$]Dcnl^|{_y ;ZYA@CEeoڛG@N)xB'In߾^IdeAD 0 l'QV՜N}a\DD&K...\22i7a;8?s = d~ZU9 Z ,;˫wyG U1TUڬϵ-Scgr||ꄙZ  PyBxB,KDE z :5/>EF"HĎby.),CΫ5qH#$IəyVH%z}?xx:|I8."$IVW9rTQH՗G+њ "jY 0̬قEU}`wg㈧mPm=1Gx]4?j)e4(l.H%?w_ܻړeXq@Ъaz|ɩ7-z@ Q͖KHHʍ*WZ5\#E(p =5MJU(9̴H>x ne@&&QZ0q\3Q1M":>,==I>f(1.Ax,iY7q`w|o'iA#k-,mK ٍ1̜jE iL ?xePذ#5B!CZL|v׏CёJ[F~F9կ~ջ`Γ_$V])euԽa"+({=}׿b}}l ]&Taj31jJXC Z[cMvx6_gVVqKK! nI_ZJZܦ U@Q~9Ky֋fOΟ]NIQ"n?x^11DREQ{BV?_~Od Ͳ ,/wLo:$1ƬV(EYyjz??!X$Ցw=Zc~# z) V\לauo|G/@57o4FFD s"`f(yCRITZjD_dZe̛a3ԉtg_y0^1"=lZ6wǿ7שꂬB'K]}~Yz,G)HJ?4U*(Ӌ5NF BGd{@xXh H7?OFȅP ѐ#1}>G./`-&a:q\]\Yp@0ޙR >;a/$"3;;R4yv_Xׂ( l9Z`3]G_¸ ˴YV$ D$0@/>/lEXґ GQY+aɳN~WW+ZkRJD"r~O>O"+LD&9Z&ls a2Po."[a>֖>|.W{ʤ)Fkeb(׊%GS PjE®"`¦ijmDB>w?|&O4 R``]/IxuXiYHb=z/c.Gd:_XWT*-`)6K3zZ~И| b7}j$eZ`g5qFEr6DLۓ'B$ˌd5qTT.b: QHQLS sbU4iHtb\L5q}}jyqT: ƛebY~ 3kaᲳ%V5*s{J)Ȭ-BD?{?@D)@蠾M7<{QR?-. f!7A `AMH\V,#"~/?+T+VDX,1n:ǬR(4* yBƪ֐@s/+U&j8Y'vOR% ,;Â# l+&(,|__~g`њ5(k$e*CK'#BظBlmJr/g1!VӉYꖺf u^XG˫~y޽o{(ySAUA@9nW =HPخ?ß?={'j%3ZeqN4IhkظgUMw=nUqnѹYKCy5?S1gc"hP2owۗ5S&\%U 8r ,-_<{{}K$_DY˚ in1] 譾qr\mO+,E\~.m=>/z)@Z$#"&g~f˔,B6-Y!j:Z,AQP*թesu}޿O>~٧E%j-lTH]o" b1/Z2Eu#Z=gέ`\uٴOV$/~?}w7)3*@k),a&v ų7ߞ=}t}} NXc,ՉZ,@e#PZ궉{K%"(Xyf Nq4{9wƱPPڸc2GɊ]sm%Tb?xO?}o曯r;w5&\' D@"?>/Ο>[g+6%IR1ZE\ oR*39 CS2q@l9Д Q?W/̥DbmA*Y$6{X,w[_].gggGGGXVWWW&/=zdk4ISͦȌQ RXfF@jcꧼ5g:d^gZ`ԣR? d+ڇl&Z $r.G䓏>? *"EDM)9;_Z!Pɍ"e*͕Wxru {{:ӢfC2݄(U$:YȬ̈́hyĎ8ōSZ# )"ԈbMn%H%+ƙnLQ u^7c} ԦSDfpO2zƕv*ʰ=I~|W҇8bʛw "LmI+`4kH+,"-D!BB"b-IeAP:J_D8I%Ifjv$w?q?dkMRX 3.nXFDE ba"A'PN *R`60xTB\QPs/Pv,O=CBC>/{1<ӝ=Ԙ4'S16zigԑzG;cދ+=vrSЏSVm1,h.x5%ogB^UE',tuۻ1+vԨCKN"hPǝcSGKV`>cU]1퇮\hpcaX/~op ^LJy~:5N<Ό\:{JI:pdVxO:un ex __4;sצ!/ =͙EyGOg7C0r=܁ Prb~ #:qs_},@ q&CBψG2?:g_w{f)rs֗ΧՈ #S[ ЃcXfdxe=٣x`_bԗX%Q藯GG|>7_45OKߓ ~~aPKq+DoRoț /_/{9|6j|s,x:Oٟ4[NN V~-:nWm\pnK^~8ޗYjD$"7oOWe—yP54vMD@^*/a$~[fkNRJ<ϕRγSz)j_ MTy5nҭֺ(c]Zl$EQ\@9.bX|oo,ٲ(1[ƥ!q\ 2iKH &4M-0-f<0M4 m2MubBh(Nmd@lC1m?eɒmY#lkJVҞifs򖷼-oy1I&1${ul}QIN _AIEyDMҏ%͗TG%;%鸤HERE\eU@9HzӚ> ~iiɃ+U9~ 7(e^d{%}GtIyQH'I@fb(ioJTR"ZAE> |$N LRI/cA쿍rIcA̎_m-1+b\r91&8KNm,[Nct t&Vˁ\tlgxM %/s\2_sIHJ7ofpݕ^\Lo4SN4P2"ΡXH꬜v5S^%)ɋs)%ɌbIetdK.i?5 $(6Ie dAcIIf+nGCv$̄$Z'ljv\g$pZ@@ TL| %ǀ/s{=U ,>pESad6LJ >vfI%O/^yvl $M!UW>&W>$dkbݥwd+eI7ɖl6mPIZ3J\a apg1搤Yf.>N$Kzsb,~+ ;ql"}Mc1Q/Mi0vOH/KYY$M˹hERJzɶJ[IpDKnn#MNt%ܩ1fI_t~o hg%~ =ØvIIP zW$m>{X:r~ NuK3 m?+ dƍ IQdͰ{tPAvlBU6rH Wt>yP;1ަ  !ry!D]\ҧ'tX#Iz6'm50%k%1ØɧM۞{$M-J#rl%3CGyCcٰIRtvQ:x 1fh̝H-[vGlkș[)Z%1S`޽^#WŌ%4ņ}/ 5$+Dl%- mkC&גbЗ\p<&m^ bJsr/:>D`9^ 7 RcJ'ے2x +.5L]Ҝ1צf)_lw@vW]9\ M 0Q+# Lߍ` mnU'Ң I/cG4.W6MiLwH? \Q]-G67;\ RLu5NM R6V9/<aHvŋQkGz >y8 I^c=I$]S9);'vv4; bUanKƏ﫪NZH0$S]^@<_ Q4w`Ū0XD-D'J&Lw ڂW⥶6M8sgG¥Gl: F )"Q`E_]8-P]aH)Q8T&H=,~> G>13ݘ;ν+WR8tIt!6NCPf[n}|?`c)a8DW_cwEw^\TBʌC$-Owp~w6\)࿉eWf1W WU; *CBHN&HT}ȘDrևzbw`Fh.m#h\ $l@-ȶOT0_y%H$o'6Z){\{D#OIENDB`intone-0.77+git20120308/resources/no-random.png000066400000000000000000000007121172615526600207670ustar00rootroot00000000000000PNG  IHDR@@iqsRGB pHYs  tIME )- ߨtEXtCommentCreated with GIMPW7IDATxحJQ.۔6@4эF͢oC/!Xd͠ *cQی29?ǹSU@ @ @_ iq[^*<`61vpY&N4kszM)$Y8^kq+-] @JZ]\L[>FCl~3g_q&Yi|x+Nm,!VTbp&vn] @ @{bnDIENDB`intone-0.77+git20120308/resources/no-repeat.png000066400000000000000000000076651172615526600210050ustar00rootroot00000000000000PNG  IHDR?j CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD pHYsaa?itIME @֩IDATHuˋU֭ꞞKM41JaPh n rp+ BRD1. f\dPuo];;|Dibm@V`&My䚩gHSLDI4[@_1$bW^mK2#0ʈ;u~v'Vg)dAneEɷ x?ʁ䮌H.v֯+<"0È$2U4pV- _uROnfWI=iiԗujw0[|f0(B7܇ӌBǎxr|cytMPI"HVjM惎e.}7hCmoj9jɮ*JW΁A4@8\DB:2]M@6M]MNO"i*r+ZcPiW.M;AÕ_ɖ I@.lՒ|=hcYS0=4 @$C< ԎAt(췚d+}-։h?{}ZJmN%@ Ql:j@tʣR`T$Hs]ȩ,S2qt0L Q}/jNV+,S}v[AH.PSwkC; VZ[P l#pk;WGRP(b)T5壿S\ is][ q0 $`i &ۥWZu!ICi=VM;`;W>}V` hRhBW۱$@oюԻ1pMl|].:K$`˨MzyNoAU4uw5!v7G3BJ&-H] ܣxN#X,Z }Dџb#K|{q(M`C\OxYxHyZ.@g)CR;)#^q#3p8V_j.l'H>q yt]a Qlx& 2d(RWFCڣwqQI`"*ك@l5湢n 9u hq-XZ< E0fOXV[EЄXȿd2nÔ$*;x'EYe~;v᪪" o-ڍ/~hʲpei"_vio6֞@f+W0h4؏8E[P%vvv͛7x`cfDA6ˢ+W̌}pa BCٱ l^ *[l$xgyu{'t:v`^y˲\x% Ĺ@k ]SCa9bz'pօ`K*%]ƍNmNnir8qn133[4o&'+c,'7=,p>aIm[golMO*xƆcIB80.kޞMbv-Uz+dW$JQL86'uq Lۜ?X,S϶ TU%5hAJCSQU[h$D X.=w''ũVuQ-f@q5,Of(_s ۀ@!69,PUSU;::SD~ }4x?hfWҶq[#r[p-b.8x䰿"ՖBL k"*\.F ,Tԏ!K6n;=#㱇7"Pt)P M`&{4- gEQ˲4 "[G#1FQtݪN ![^zuN"Ev8j;BsDZD4&އAhcE$,bhGTyl ͠BN 0kb,K޶9$fyn"P[Ů*1pUNj84@Tw.U^N]Q L!^v]a612qISD+G"PLhb'DE+ٕ[M H$0â'@'1M^t1Mq3Ъ(XŘum$kKrCZcIb)RsN .D%~d  ( (Вj-$pѿAED}8iZČM9psMw{cF)Iaa"-L.f7}ߜݶ6[t$ЖLh * e[dw 犦ׅlO :f U @D> lO+"(^ 6CU5UZU&eS8I1LQ׵FܹsǞ={f zkӣ^44e/R|O& !Űr|}t39}kRp=t")g{ yH)~\pDxOr`p <`f}~Ntخ]ooOhl2ͻwzO$tJxu]NϘŌ.|?##ddddddddddddddddddddddddd )?IENDB`intone-0.77+git20120308/resources/play.png000066400000000000000000000063441172615526600200510ustar00rootroot00000000000000PNG  IHDRPPsRGBbKGD pHYs B(xtIME-c  dIDATxkpTƟ}Ϟ^ل !D.BA*U *NG|pSToPĶ]Nm@ \A dsξo?B˒ =Odw;ov<}wW\rʕ+W\rʕ!õ  93\]AJaaR 4U PJ^v>3g0@> ёtrԊ@See TI{[{Fف]!UW%~oMIq;QHE?nĊa>j|Qq 펎ci*c ={}S6ի{ -x}9K[ ܮ3gf Inc\Agdh|lU[v;nTb}<c^ q#ǃɓ8rHY^^^cҼh9 >TpΓt3IXs®Xt)S喚{-fY%g$488@ƍ8<@K_ /ÑG#n,\6> ?yI^gMӲmq#Bk#S*`_SSHV&M$XGGGtBfF"GFEyV$\ ))-Q#݇ >ґ~dH'"Pdb-v܅y4Ukނ= .XQWǴ@$F sCX R;͚eYWUT/nk˪Hǜuݯ2i>ZqPJQ2+_A&N~cy)Mn6 P%SmNHi%%%~ǣQc"a@TNpCI>iƢqE$fŏRARooǜ ~ǣ & AA˶0o|ףU:{¢•ySaeY BA/"Hb:u(>wCMM`B` P4><ByB}OY3qmYC]4oqqq>s9"jʆ955iY XsI 3FJK'"n !߿Qs0SeĉYf%Z[[c+ 55i& t!L8He²LȲ_pD{JUFEVl]׏JĒdB*++K8q"x@]ס( đGA(u}e>{o3ϢK(6%^( ESꫯz~̙/Ria7ԠjF5Lӄ2:tT50se~'9L!,f9d ۷?H+lEZ|@3UUUvKK9.Yį(tmEՌ*X9  7 òmč^č8dI'ceJt:x̶ƄiIӬxڲeMMMQae9\'%iPt{2@'aY&8b"ô,F '۾Eg1ܴj5v+`[b=]7|> uyǏ 6T#msd҆e[0 7bS2$(e`RJio /[> Uӂfm BM6`9\x`yAL=B3?:!1@=6h H$#Om5M{/Z-27mGq9u:gqI;S@RQ!$ōGH.u-"2'$}Ȳ.8>e0 "+ʞK2k`EJJJ@]3ni$4HgɾM<ƸNg ^4*MBSSxxfW_EmrKxk׮ߔ)(ej]v_p!.+B( M@A4SOo; Ji$zl钥/ʲ,3׮]ەsRJN0DvcHׯޥA2Ơ*(moy鶴Dyyy1BigV^m]Λ i\&Y׿% 8v(saI@)(bqhB(ˌ%^؉7|ނ‚? z>??rAŋB)uk "{F_3tj${{۶mBW^Qٳ;؉EŇ@5d.f>X_GM?/̾?(?{,Uzojlqq #a=@כjBdg__ bp!S%ɓ}D'cG cmj6߰';w;vr@R{у L?qe`^^cv~Է?t׭)k Ӊk c@5ºE(X:fo}>/9V:uX^5!P~_n\DuuuX019ڽb1껗͛9^:V:l<|0=*k"Igڵ6&8!D-"h@)P?*R () U$-iE AQ;uO{wkk{ܗG:9sr.rtY$?'?>%IRJedYF$mض?8z:kkkLLL`P421wTjݍ366F$4ƗvHT:P ?fHT#EeFG7T*5"^A[rƖ4wZz2&HoVr\: r\5Vg~KPa@vH?>: kdrkdskld^b;J6!MOL%Iģq{+9zWҤg$UY(X^^,AMINiBiu ;6[>,kcA=E44l{hCN *Ls$`}j-K#' )B4=$ l76x3*@d ۱N$ٹE`Yz ()H555I\!˰%dc)!FGI'{o 8N$5%qGhx!$ |,;lnlɮJqxfOsL:N*9_E=d ZSשT*38N/ \ztӜ8#LM`tdw[> I; v7,"Mo0:2ӟ\>wD"Tl˒HH8r"Vr_mw,U456̈xՍ+ MD׃tO/|`?upQ//WW7MBfW-*…B-fffPJL&q{ٖ*@kb81ҭ\˗/N)=9掙I.uA.#׻f,#\FFF8r*e 8 J;,HX< {N{*m_8v(Z>H+.|>Q}Ζ 2ML0MszRlB 葮FguƸ4G"c333CEӀ[fDwFړt]k &M(o?]/ؗo"^J>giiɓMx5ַVjfzf'JRUZ^(H;%I+}*wMW‹LNM0;3͝a1낝,?n@o,[lf)U*Yz!SSS!?t/._ΜB|˟Y\C)P劊m1YZY f}}H$/?6(V;BU#DB"3hr+x;_>TE5Ʉnnp[r=לּ@HOV˪Q5Tjƻi&4BⳜU^ -~g*wg4}p$;JJ\:YVV#rhȒB?ʀKRD@ʕu-45$XQ/b545B2vt|UNqk~u-FS Yeɉϱ?roB(`z H,2ԡq=&jcvS ~EX\x5ujF!,YGӢ$z\z{c?/=(r4d~TU%8ˉc4 MՉ^k?\+mK@0@3<߾83GfǃȒ%dv %y8C9ؘSaeEQey$yJ橩Z}h @mۖ)O~|!%6T T2N)FG"IJc"0g-ui(;Te T9^ @ 0T۶^@Q4Oq؏ʩp{V,rny`7?I@vB׌n݀5Ooתn٨l7*i r.vtn۶4- E]; g`VOʻU=Gmfz7w=ib@;N?״PGnU\=U`{~kpSeuJqvȪf1vo7/thl6+lۖdY&|rP% 0Z_rɾXJ[[[[O<gΜ=o۔Y7j]yWV/t҅-Etj*J;wςG "e|ҥ?YZZZݵ*.xwM&I@BȻ_{/&II$IV>d2Y. ۙ]ncGH˥lZkW]7ޣ..⠘W0ц}@Nz}`W} y cIENDB`intone-0.77+git20120308/resources/playlist_view.png000066400000000000000000000004321172615526600217670ustar00rootroot00000000000000PNG  IHDR@@iqsRGB pHYs  tIME '1[tEXtCommentCreated with GIMPWIDATx1 @/ynt0,Z w#9Hι[V|( 'p6= 0^IENDB`intone-0.77+git20120308/resources/prev.png000066400000000000000000000102231172615526600200470ustar00rootroot00000000000000PNG  IHDRPPsRGBbKGD pHYs B(xtIME"*MIDATxZkp\y~۹9Үd@ʦk! [E"MۄuelM -2$$NNc.5[!lV+|_ٳieL'sݕvs}}  @ @ @჌:a,yG@ `@/ͤx+mii8M]=54thOxn0/۶ŜsZ?2 ?oCE_l,dv`gmmm]V?#` v})V*躞cey.t] O[ژ9CJ76664κxBsc9Kye*nRJ Ī;e{wޅpi)G, 1–e͗k׭üK/֭[#NO[B\.B|uüyزu c f>p̗J?8jkbt]W5HjkkÚŤtΜ9KHhH,P7nČ8tRiq`mmmDJY[VS~<轢P_?cRc:m!K4Ϳ$dgd@<72L=Toj2nj[F*cJuuǍzƘ~4̘YwV)92uR)͜9sbhT̘Ysq-ni:Q .:"tl;sX. b1qQ5MwI4ͩlTJIRԷ)xi3_AI0U̞=;9KYM*ywq`.T9?VXar9q3dlrŽ-K24K!S Z<7pR,!\x Ad2l5F1 wuuǏ2c]([)U6Q %AM.؁bBG4r̪!W(pemۯiC~4β,E)Uѣs26??6oڄE(@)+Y\*CS-mYRJϾy' ܸ]8K!>fYbsh Xj֭Xh%$2S*XC1ƔeY㺶SOuLF7h:w8D6dRQNa_QޗJUYLtuud2:11IF@VJ. LaPBh>J3ED ,fYG45:.o6Aj4Tx1) ̈ TO0Ț5k###md2ux"P7oF,V)%dI.)3R %3<<<\9rx!HUSdm\ŢJ| =TJ #ꁭ X@!M!˂Bi]5U_UnJ1 0٩۶]@K r󎎎 ˂s ܄50 0(QejDIM zO]IuRʸ[q_vhz0B5$k?UZR` h S_6T]R!! Ja;7)2\^HUlx{یX4OTPʯ77FPJA* %%C`R Ƙ?ݞf@@ Z}H煅)V?;Yx9wHZHz/~ZU7}_>rbz:C7WR*MUBO цOK%;kkk<ބ;RwWB@S&Y҅9砂3s"d_ok׮w`` c=JEx)OLfʼ(KS/W[|m>Uh( (U4`:(e*I੤RÊ%sQ2fx USVayk\%r,rߝ(c;qϽw f"clAP19109a5sK /nj)\@0B fRNBU!8"NdhzGǶ>Xfh=L*rQ`޼H(&N47HfhfGƣ=|~y9:80 BOt1 !DN !RK]cN4W_?M`!d5_uH)!=Wp\閜 Ԣm۶nm' nkj]ء4-\Ua !'[%UnŒ1!iژo1D/?rM{ǝ5l?~?yY544!4,2]hD79Ϋ7|17wK-.Z6;/TLoRIy?L^#R?u⫗]k#ҏ<#ݻR0 ^4us\o6UMxݝ\zd"qŞ%,{C{ $h۶u]q!JR()8vWZuf֬Y,J-[YB7Wwˀ* XyZT͐Yzd2yJ)ZvSWf˅, sB$N0&KV+۶zҒpr߾}!q;~;˓ۋ755V^ıad4tz^Uzwwwݻw---rnv~5CM'+>9m^¥ŕ1 !8,˚l"nkk;ivjy=Kn_8ᇏ;~_R''9炎ҥK{9 YzuJDz>zH9;iU7Ɓr] Ø,!r}B/hjyʧg5-4շyis0ekKR)?O5h}Hh4Z⺧M5]3ώ+Jgu`$S?x+y^H jii$S% o^WlKxyKj(9T>NpzNAzYѕXm7;>>oJfY72/y<ӁD"19|px$_uw}Ͽp՘9B_']xS;~ûz{O3xʯmbk[P =v pǎ[✫k !D߿*0gozr߾sC|ޟ@_Uξpvw_«br ==~3 ?+i׭TJYN;B0 CbQ -WrǞ7|S UJh/_t wDw~ 22F)('JYǏ7?>eKᜧ"'(h__㺮_X|U=JTcc ]`UqJ !C8PJ  LELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC     C   &!" $1!1Q ?Wso qFnqKq$>dָ:".3G;|Rtui-!ௗXcj=zCcd`-xI]eWU2{ i*r1[q.1GC]O|&N$i BR}s6> /9mSG.M[L+lZ<\̈u Wlӑo/շ5^yW̭O_^ 6={hTaə,cŵr2#9$XRǠHq{\73xĈ[$eE R> 6Mxڷ~5RMYb͐Uh̖,BITタBJձx;:@ͧʲȫɮ u 69`;:k%$AUtZMN6"LIintone-0.77+git20120308/resources/record.png000066400000000000000000000100321172615526600203470ustar00rootroot00000000000000PNG  IHDRPPsRGBbKGD pHYs B(xtIME $=zIDATx{l\ǿ;qL;ɖ%wQ-1[X*P]̮ !R$D(+ժF@]*`h;8Ə8wx؉M;G;.PT"HE*RT"HE*R|mг<gtET.&/ &nA(SU5辷YG۾8z"P--`RpDdșuAd2WK#&@i,:~l۫ok"Ib$`%NN2[VymB$>Qeq`F"0ϟ- `ǙBA)R_D:R'N$H~Bmmў3####WB eȝs$ 졪o>< κ<ֵυ߮FjS8xٶ͓OOXNgvٳcW"f (_~ywaUB!jۻ7N0ߏ8`3(4aML ގM(Bm*F]>XWwR$ȲHdjIܽ{dVض-W^KrSL;0տ%o3K P]1< ehͨ޲⽽&m_$IҖ/_nKk "큱k7&)$#s43g lR%qO:qeAknFpf:`2=(>Y[;)IE񎌌$.(n#B]s6~p?EApӧa N;߹`7ˌ'`aE`ǁ#v-E?P g2,_?YUuAhlllj\vm(O}kww0FF>]}])<7rq}iE"TjK dUt__}G,t#$x<͛Ǐ o۶m,˞Ν[dVΝqdNl; d۠$|s4ʷµB7멾>؉B\lDUU,Fjn xu`C$&0|>#()`OOP"ԕ+;+fh`)ЂI͹ȢӰTjl]|%ϝ\k d2a}>Th)Hm;q}K&M.mdf L 8D.̸ZX<A r<5EQE Bp1=5MA̵09g 8'`cb+3RTpp2uuö\wIo͙I`:y< E%z&Yزr[ 3|&ʀv \ʖ2!C 먋 02D 'E6_ٺM||[d9-Wt 7DDv>a*;noo=(YidZWw53] )}9䴝XkNj 4qd<$@`6wsu`gmDҴIa'skM,~\UUe.*@*Y; hřWbX <@VWhM5}d T__Cefn3vD2߲ ]Q@|)fwwmC"Ɂܢv8<Z)L*3PCוŔu\ij$?Yވ|ƌ,>wα.\z>rVดJk+q'&Ȳ̖eefu~B1ŴQ/!@0 Gq6liP@4-|^š^u믟-e|br@]wL>aY>y>Mxzzz%pǎS$b+LFĺ:hkbD[bm-}0{ժW\KjM$_SKdzIG?б xlXU5.a1Grc0Ͱb1;xЁ,6ALWW@WWWRlkK;?a0[ I[ si\},ÿm I{-ئI79p4\1 l5ɾ{OF!mr{7|ĹKC!~[$`} ;.Uhkk3^o\x _>dyFIʭE*՗kn崗; 76"ߏ>KOKo7[ Wyp 1[&D؈@W A#ȗZP] 74 ?,8=-[ Q Xom+L6egS]'<2@܇̰sӲ9c@A7 RU~ . {?>$-[f-8o 7nl_xUlMvALB58[() q$W!51FY|>(344t[oկ h裏.<GO!KEn-܇_~ k|8^-\H@ZHa,N$cfǁ BzS6l0l۶>|/MYx)&ضm=ՊT9{lz{B6*ɲSa:(+Wa7zq$ i+xsh~DulXQ(tv>)'Ԕq4f-$LZ@x_{:;;Cى ٳ|CfrUk+ya55}\1M42##H9L&w]E9Iֽ~!ϋoݺ5QХ_t ;::g ~۶EGop;Ƿe5]bw_g =$/ux1^5kx~j&? mw&&Va¶\ALpm<,3dYkrr2}.-NqΝ+Wժi3̶m'T՟{BZZZK !M8:>#2D|r.LR-%x%=iuIN.v}Z1aQT"HE*RT"7-OSP&IENDB`intone-0.77+git20120308/resources/repeat.png000066400000000000000000000100031172615526600203470ustar00rootroot00000000000000PNG  IHDR?j CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD pHYsaa?itIME  2AIDATH}OlgƟٵr@BJU(r$$T!",.= }@ArX.4 @=l:p(8I03cҫofy}y?H7 +] +{K#dÿ :ALmn:s L By"齸DoapS;xVdVc:| ۮHNߐtimFeE%[=Kϟ9##I++*IA #4C,]!TdjRls_SSN>7o̕Mf CESN QE1rMUhk .MSgm I0:<"&r(atX k<z=j!yC #qZnwJH2lxm8ZKr?*F;$dYtٴ$|'ig3BWMB5!=,Uy48YGbs1hlZM#sOTIeGzl|Gip>ɖ"vz?GWd=@l@# v|sʕ+W\rʕ+W\rʕ+W\r_dpyr 3NP7|VIqiݗ,əȕfq @4My? Y|z&#fw&S% VWW6#!@b5 4´;UqҢ팱_ ,;̙2(P8lzEsv.'Dl AhDdYT*O)U!sMDa;6Є7ܫ(y(r\7nDSS\Hz f|yA hHlk ܴXWWcǡ^̣(r֭(/86hvih0M39Qs 2B;M+VPÌ1EbE)f.#D$DMcX]˵m[QUX3g7 J3} x7e655/m.3Fd$B{xhA*D,MW+C-!F5pfΟ?JR^MdIJ2{bL.{OUVEam/ZT-m}p>8sB3#%`n .(b4ngggP$r#eR 7Kro*j*1B(s<# VyMSn.p2M6lBc4.55Ŷ 9G,M +݈yg{%% ۶Ɇ X"I%@)Y,}o87Ν sΥtD-[(X,9$H!V~fT/! &8Vr|X #J($PU $IŃX۶縉 lΙp= . .8xY**dnii]]]A˲LY˗7 8[$oc"ضD2B 2#[MRbB%!L-Lo};ǵHgFnB.@(e$AUɯ---Hu{e'H(SYU#ɿB(QWÛt /7x3 Ks؜ʪJCܾ^c ݆%$x 2 H 3K&30jKg:;s؏]TU."Q D! r{OnBzVCEh2 @f&O]K+2e?,ǫ1_YXX>H%dIfIDzБـaYy4w1,hff ȒːJ3F1VT*UO <t؎= 3m~1!1ȒǠF˱k?b=C0af/mĊ+bipB|=H^Zbܹ5;NPb+Ifb4|f2|"сQZR{='z|QD4rtD[t&e`wygp EQX(oU~Çٳgp4UzQ63%><;h9BÙ8q E%/hcx˲'ۧ{hoC9Y߿imm>N JƓSd#Nw^TT| UQ!ЎX%fmgLgYQQ1j'PXPi)\5UWW4ʿPXPz$:0xw0{VE,y8s7͔[6c@+bN<َ‚[v|͛.] ^ ^F\С2pϝ?ڑZ72pRLسgǶ!Ur ɼsRd*Prm6=/qۼcM6]H$<===%sW!І) sf+SU56{=nݺ/1z+**:7< 6Xv^+D# I;p88N8Iiڨ\4{;*k}RV]/]_(,Key\2p؄k֬ IR`;5 Ύ ; 9TE DhIo5Mt1mjja:$vq炎i30k֬-++BījwTTuvgvQ]3?sH sw$]Xu}J.IYRTRS}; q oi10ڵk/iWQQٹq߿޶={={&tyY0$7qk^F}坕 k-xsxsR 7mfrhccEIbK.G׌纺'奟G>4MixAQJOcEi͟Т%|ׅs^ >1x7mfk>' Ɨ5ܽdv EU9!^h˳\JҤݦiƖbEwoꮗGR2M˺W5a]nx"@UT;9dOmF1߿vm+EGp &b`V555 \|k|ߣs==?wv\/lRJ.>X]Y{at_JS|7M50[^}\.**XJVUu~;/:3t]nuuu,=p8V_{EEw+Ͼ>o|W'';/^4(^B=z"?ܙ}~y=%B& ?rW4:#y+ť_rK,??1ox{Y9z k$I;/#1&ّ[aAZ6]!M&'>6ʚp8|C7!8!$r3XqӸ\rʕ+W\rʕ+W\rʕ+W3]:΂Z&IENDB`intone-0.77+git20120308/resources/seek-fwd.png000066400000000000000000000070311172615526600206030ustar00rootroot00000000000000PNG  IHDRPPsRGBbKGD pHYs B(xtIME"3O) IDATx[pUy/g} NpC @0x\g\;/gHi_<6ۇm N&qjb$cl˹Z}87 2׬G=[߷Z: (P@ (P@ (P@- "mߝV5뺻CvȜJM [ƹ)n` Micc;>>aXjvUO`zͪ!4mÊbb21 Cok[9L?re2<,Vomv(z[ʧك]vSQֶt:-u]w<ϫlvF[ʧ(v܉SNG)[[ZVt0Ϻ+-rr u4X]w_֭[ ?x2zNgSJι&e{]_#Esol6w^u't:}mMaWgo> f׮`YV~e<b*0$Ø] ٮ#7jimm]jժUq烃X׻W <x7?@ɓ'`[]]m'Y!tN&n*ZBQ[WS᦮<į*md'9뺮L$v4)nx@ |C6 --e[;wnM8lbRJu}'H%+;Dd}\Zٳka{gq$!}ƘР}gj뛲pY L#59{q?xac( .^m# ]?pnM$$F4M s=;V+Vp4MRUyTsD<c/)6;lwRh淶 PJu -#kkYVz755-[ m $T yLNM@᡻pWc(!_ G蟅B!u 6m߾ xuu.,- =aYy^ӦMjV51U Y - Jɥ1w+?:M賺,c#[|hT9\:?D!`zf:\nhGm1 #|#n-c3tB0z{!/r T#7BIH$͛ ֯É'bBmuBH)6۽p_^u]үp|9qqWR"6BIgc~WWz9e=DʕZ0 J@(-HgfW?@=56ch4jsΛlRScLQJpAa&= pAmvi׮]57kEYRJ]R)RR|~0];wСW7`|MGL b4iͥdi\@!!\ÕJ~{rz\.79kbݑ[xppFOZxTCe$<B؉`W6>~tu_|iM|]u9n-ؔT:;JBJ}<"\. NMa744d'O{צ?=8<xB -")[Q #0t?~R7sn^c_g23*q3 2!y+<}+^!P$|)ss5MMsRy7"9)544ķlْ;v옺=жm9#|RBAUqu1+Hge{ؾw?@}n|۩ԕM0dY(~&+K yn|SSMe9{Up}k``]=\y*(Y^}_=X-\B#/p\>tfRD#1H֮]SOńm…T q OY [ +'yprPmml6+?._[Mc V`A'@PPJ*R'!qH%{FEfh[WAA@B/(@}} `ɤB(*Xt 3=Ԭ]AB0!+?!B6; J)&&ƱoF! ;o772yH[J`E J(@*5 }E V"_töи >^7u{MM-8V5]/!|ߟJݻWrC8%K `iTe)̼P Y6L#>/q~533C4M;$577< H2^sgyfQkY0555}8+P*I)]Te1 `BB&'S8WCB)KeYS4kh՝Rn'YJ#x BPmiUQP,n)7buPa!0y~~gx㍟ uu OS{4rܲq-~` )e]Mdam)GUx*YكL#](\GL&M 8Ikmd9رc;iZnmCþ֦KJr^)X~YBJ9+Q9SxC CchⅎQƘ0cǎy*rk5/2d6[B!YP`(%0M 2wOe9/8릷oߞ"*RZ5/s΅2O] SJ9R;ӃY pqzMibƆ}--. !D>_6e))&wʕ.X 2@]3`mfX}BKƓwuT*5XD"y w``xT4)z衇f R %+1a[}y]O9/.8鑑%q@-kw g6nX5]XP¾h4L(0EO^Wly//)D,K݊mDTzW9VnmLL[o>#5wt]BLβ%sTCCCI|сhNx;wOݞu/qA)T6iCɤ0 #6v8R7 ~*C775R5m(!7dZW~gwib|||_t tNd6lz4M)^.\mk|_;JeV-RJW͐#ݿ? y&-mqUfF$L<vB/(B_|E{ǻ97<|0D8$嚘R*db[7M|_vnX &N-۶}BHvLN)`@ (P@ (P@ (P@sKzIENDB`intone-0.77+git20120308/resources/settings.png000066400000000000000000000050311172615526600207340ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs  tIME c IDATx]=lEJ!H @0UNt̒,wNntBNIaP(tI J4TcD|):vfٙ7o޼ `0 `0 `0 Q3ϰ!eOlTP|u":(sz,+y9?o7s~3fTT<@`&leB(0s93+:XVxfLA{3* `;db{}5 yʣ}Cs?RnOC1 n.U_&)eN1BS=fҮ[G/nX5TnEM/E# F",6/L)>-Q+,b8 YmCg)7  "̢ g}q3lfKN$-׍Xu0Ss, [__p,\"G&sMD;]Fn;bjV^ιC"Ud-GA7]E*A§)FCy)<Pv̧Щ+>۷C޳6`_? ys@t/đzWňeD^]ߞdP҈Ա$8ö} k0]efe5O)~g9\2#Ӏ/}ʛU&헵 C4?`'GĸG,ѺDt'@+:"wYk˞g6G>!DTKAsR <'Hq s[D^tޔ(ZZi1uzx”D"E@sn3lPxwNm2t5}Dv(!YhH]/&M0ny{nx"SLBDT% !ഽYKV4dkT, {R$ g9)@1tZs@H*zNwׇ'CìB2;ⓎPO' pLHjb}3%?2b:ÓgSȦ=dlDs̝sl˴aPB=O]ffR:hAks䦀; ˮAx'N5O$s6kpUӐL#&{jdh} /pYB>\um~i._|)?k"M=#(r,w}~=`;GMPC&4/qVPcCݿ M!!tPbe?GUxn pId45'd UGVYV=RN- On"鸵#C~ܡeϲ| woV9a+h1u4VQ#է%eW2Fˎ@N_(&P59d7S>[e+ʥ{[xp"_bE^ǔ7 ;'?(5` >(q<WA4믆Qrye5)A=uh{(+S[sY|AO%of'Vhl$~&~=$Q.[2"S;[&?: (SkЗ$<0D)|SO֍v՘#?9i;u,$%1wԔR9 %6Y4bGxr[y|ջesPf ЛBer.P)`7Pq{>:*;U3~`0H>wwyWDUg"cL%%tӭ]10"ǞE\AƘ Ϟ7TX6.z `bDtlqS<c;3}$S=sUɝ&g0x翯1EAQ.btv3_S8!KDZ~>E0^/cpf83wȱx-mŚ08Cq|[Y ̗Ex h(h.^$3e8DpM̯'擙/Hi9(N̶עы@FIDtX_pJD,NޘB_r7 `0 Cf g|IENDB`intone-0.77+git20120308/resources/shuffle.png000066400000000000000000000011171172615526600205310ustar00rootroot00000000000000PNG  IHDR88;sRGB pHYs  tIME 59&tEXtCommentCreated with GIMPWIDATh혱JP@oZQ8U?å./TN.n(MC],vBiӗiYrܛ'(((2N΀<  pӘk@1.`Đ!@aXBBEdTI&""+ N+?廳(ɐ'w Teu@P9]D[4JaG'X.AƸr޹kYf9SG.z@2?r! _<"r,"n^0简go~/T94m,gKM@5$lfV.dLǰ+{c i:^% 3-'ֶNl~9^#j1\`+*-"eY wYD|Ddݲ,8yV|y]2,QEQEQEQz AIENDB`intone-0.77+git20120308/resources/song-shuffle.png000066400000000000000000000015451172615526600215020ustar00rootroot00000000000000PNG  IHDR88;sRGBbKGDC pHYs  tIME 1A^tEXtCommentCreated with GIMPWIDAThKhSAMM(tRźЅ..D>VQAMBp-B[Et#(((ʢ`  VK92Icr3!33s!UQv10Lcu= [eb`?0o\P @Qaen?pB @I'm,p9̄4w-ޓo` n-=Q8pHswJ+wQc@Nc$@hyxz ߈{,m*ױn0bi{3dc׻iXR74~OihnϲNz\o:ZXVn1-(zj8,l{gI29`ЧG5Ѓ4:(h5{Cċ*4}-.k,lf?uF3&jl@7y\]=`[t׍Dx̀:<x~F'&ţ'ˀZ6Ddwf3ƚCc"P1*8=&W̠P Kv˾D$.t XyPD䴈A""C"-)σ%9W Y`y.q5vf<:-We$ BIENDB`intone-0.77+git20120308/resources/song.png000066400000000000000000000071631172615526600200520ustar00rootroot00000000000000PNG  IHDRPPsRGBbKGD pHYs B(xtIME 4%t IDATxmp\yܻ/ZeI_$؆&PJfHILiHK?_:k&IIga:4:&M &al0%eî-K,G3{9yбucX:ֱucGGw<0nfDɠ$~ByV@w?~M,7a A+2aHC Q5% 7FxT#z -+Z 7[&A )Q D'(& ⱈ:ϓdIgrSyR Z ?yW]+׾֓\g*AA ڤCLﱭ,tV=(ƴfR:ϑdrS9R,hFv.?-en! UCJ R HlÄH̑d2r,lL&O:%ʑLd3ZE :~Pd4"~P A>#ʲF@Z+] |\&O:%ӝ˨"Tkb8 /b?O_FdrdR99E2h'zoiE*S~OUD|.'Jc*i>}d6xA /΄UlHX4K<#7_Y"h&-*eVM'2]>șae*:h TnK 7Jw_te,WOVSSAM5554qJ%11Q`l|LJ)ULR77@GGSRrhϹnB^o0vfɩg| *W&1&hE|9PY+QݛfYhHYc)gbbqΜ)7u+x!P %xNۿ'] ٩ 0`}m5O40 Όdr #p89$OhpUAVVo9{bI!rHo(tmɥXz{(%AA.om;3߅ִɁmJ9\v" WĤrw?VLSp T"&V'V'"Z`+1iT YQʨ[kVd EN&2FXЪ.-ahW/鲰r2XFn-@>|8&$X:rok{ժ+fׁ-<2Gk]Meh%*8SA$Z+ ŕ1X:s] 7zR۬A[ (ij`4͍@X=h]QEDI l6G;M+E,ڍV`ש'uoUT,j:N9":v˶~};ۢR(,V bC9e> u'{?bJ j(+HªQ ס(Ky@wykR:k;'VV=AßMR RGp.b,Xx?5&€YZb?6%|SrhώT[a0^ * La8@{xND48Q$1>UB぀0ڐ M7I kuW}*-w&k{Ն=d[_n"jU I&ȯ_Q͜靟J];#S] 06Z9D# K "qd[i4>>(F]{ 2W]lܰ]DA1X{ndMEAi6Α.pp[2tϽ,T9FuA +cAZjk%ٺ'_=O.9*>CnD5ܼ&]iPRix 33v'N,"炙X4P!,_DƧ$$06@Hb G M ?} cE|gBX7%_Ě#غ]^ێRr$i|`6X&6ӡ=jLiPk3Y< &7󏨮Y(JL:Pbej4H5Қ́3nHoXr9U2ls$roNny/Ja*S8:$&Ut""XbV!E&) Z#c#N$|;NR6:{h!ݽ\z;Vv8=vy995RP(?\2%]`;nAk0'FR'J5U~C'5c^nr6SIP翸 1r$ < ?`R"DD|-]t{Ҙk~cF|c En=O_?x0c+!pۅJHha?(2A% E,/{Hb쓅7uN"0n򗎣K__JRĢ1} NZ:s>ky3c޿tq5ZV/S#$SJCd16$7Ko'@7=X,r<.Z `,< }Om#?}ft3$*#Prp7^mT!K˭qgCeL2U[^}5V1S| 8m uF+F]3=O%'ws^9f>LuswCG;kՔs.O*㌜w8q1*kT<3Fh.gQ\?~W WO)>Dر]dźpŠV/Q)bd䴔J0'/O?{ioqoPGfhh8/]rK={CʑZ[Ӭp"@8zcpܦ6u plWb;ȅ.,K tmtc8;EEZb~ߘCef(yiٴd$BͥYf=< wQ3ch倛 L U|ǢE\ɢ3QlSMHi+b:P.R,,sKOr -Ɏ 5_jy>Kjm'/p!\ d﫳Z\|(Wr\ܹ|9@vcXǖG- ;IENDB`intone-0.77+git20120308/resources/temp.png000066400000000000000000000005741172615526600200500ustar00rootroot00000000000000PNG  IHDR88;sRGBbKGD pHYs  tIME %btEXtCommentCreated with GIMPWIDATh1AQ3/TDMѩ)m&TXXDM 5$ A#&{%33333333333`= gp:~ngyKI}ZXT(2|8gA 0d@#k;ffzD4a怭_N@7}P撖Aրt4k`)i.\UkQMfe)4l}y̪|vR9IENDB`intone-0.77+git20120308/resources/user-home.png000066400000000000000000000070711172615526600210060ustar00rootroot00000000000000PNG  IHDRPPsRGBbKGD pHYs B(xtIME09 IDATxZ[$Uݳ;]O +8ـ18,8E<%H '˼/ /6o< !!HX+X q/ ˲^m.=]rUծ7s.SU_}c;c;c;c;chnf/Ipo@$W_zw_|/|僸f/?x/?/_D4~Q^K)Dk׮ի W@)RZ=yr;q.+9j6Z)vvv'@kJ"<]n߾=eu@KPe.;G1,˦Ty7ӬNu\cf%x-=ZZ )%N8^7ẳqq=˕5u.(8R1#!RHqύ{Mn=Oδl{ݗ ʦEmgYpq'̌,E66&ʮ4 6 x8.N8puwdЃ14sd 3vc Zkq$Ix$&B} ]<ן@, ~4 !FEHi u}𩋧ܥsX\x 52M{3DK^@fɓx" GZ^ֺ~֕{FmxBExD"; hrR:RV$] @)~u +q3Ib+۟X_ _7~wP02mg/~[pT2p+ .ev'΢hUӈVMg?uYWB[ue[$8=cvqB@U;3&v^5#*N[ )Et!`/XYyFDc $A$HY!)B90!/=Ql~ʨۯ-'¥kh\A Y6Z;I 2ihdsExӸ {($elr|kÿAfWOĈ@ܝ x1< !-8Jᣧ;58D?θyhӳ΍R7Ae2Nv< C iW |Covg wjͭrXop'XԹ * * callbacks.c is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * callbacks.c is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #define _GNU_SOURCE #include "callbacks.h" #include #include #include /* respond to bt keypress events * currently supports the following * XF86AudioNext, XF86AudioPlay, XF86AudioPrev and * scancodes from certain bt headsets that arrive as * Keycode-171, Keycode-172, Keycode-173 */ void key_press(void *data, Evas *canvas_in, Evas_Object *obj, void *event_info) { Evas_Event_Key_Down *ev; ev = (Evas_Event_Key_Down *)event_info; double current_time=0.0; //printf("keyname-%s, %s\n", ev->keyname, ev->key); if (strcmp(ev->keyname, "Keycode-171") == 0 || strcmp(ev->keyname, "XF86AudioNext") == 0) next_button_clicked(NULL, NULL, NULL); else if (strcmp(ev->keyname, "Keycode-173") == 0 || strcmp(ev->keyname, "XF86AudioPrev") == 0) prev_button_clicked(NULL, NULL, NULL); else if (strcmp(ev->keyname, "Keycode-172") == 0 || strcmp(ev->keyname, "XF86AudioPlay") == 0 || strcmp(ev->keyname, "XF86AudioPause") == 0) { current_time = ecore_time_get(); if (current_time - keypress_time > 0.85) { play_button_clicked(NULL, NULL, NULL); //printf("time diff- %f\n", current_time - keypress_time); keypress_time = current_time; } else { //printf("rejecting 2nd keypress. time diff- %f\n", current_time - keypress_time); return; } } } /* randomize the playlist */ void randomize_list(void) { int i; seq = (int *) malloc((no_songs+1) * sizeof(int)); srand ( (unsigned)time ( NULL ) ); // Initialize seq to an ordered range for ( i = 0; i = no_songs && loop == 0){ //reached end of playlist elm_slider_value_set(pos_slider, 0.0); play_state = IDLE; song_index = 0; seek = 0; if (view == LISTVIEW) { elm_genlist_item_selected_set(song_list[song_index], 1); elm_genlist_item_show(song_list[song_index], ELM_GENLIST_ITEM_SCROLLTO_IN); } else if (view == ALBUM_ART) show_song_info(); else if (view == LYRICS) show_song_lyrics(); elm_object_text_set(play_cur_pos, "0:00"); snprintf(buf, sizeof(buf), "%s/play.png", intone_dir); elm_icon_file_set(ic_play, buf, NULL); return 0; } //song over - start next song if not end of playlist next_button_clicked (NULL, NULL, NULL); return 0; } //check for alsa error for bluetooth streaming else if (bt && (ok = strstr(dur, "Unknown PCM bluetooth"))) { //tell mplayer to quit ret = write(fd, "quit 1\n", 7); //popup message popup_message("Bluetooth Error!", "Cannot Stream over Bluetooth!", 1); bt = 0; //restart mplayer normal restart_mplayer(); return 0; } //check for mplayer crashes else if (strncmp(dur, "- MPlayer crashed", 17) == 0) { //printf("Mplayer Crashed...Restarting"); //song_index ++; restart_mplayer(); return 0; } else if (strncmp(dur, "bt_audio_service_open: connect() failed", 39) == 0) { //printf("Mplayer Crashed...Restarting\n"); //song_index ++; bt = 0; evas_object_del(set_page_win); popup_message("Bluetooth Error!", "Cannot Stream over Bluetooth!", 1); restart_mplayer(); return 0; } } strcat(dur, "="); tok = strtok(dur, "="); tok = strtok(NULL, "="); //set position data pos_time = atoi(tok); min = pos_time/60; sec = pos_time%60; elm_slider_value_set(pos_slider, (double)pos_time); if (sec < 10) sprintf(tystr, "%d:0%d", min, (int)sec); else sprintf(tystr, "%d:%d", min, (int)sec); elm_object_text_set(play_cur_pos, tystr); return 1; } void song_select_play(void *data, Evas_Object *obj, void *event_info) { int pos, ret, i; char *path, cmd[255], buf[PATH_MAX]; Evas_Object *li = data; if(timer1) ecore_timer_del(timer1); Elm_Object_Item *gl_item = (Elm_Object_Item *)elm_genlist_selected_item_get(li); if(!gl_item) return; _dir *song_data = (_dir *)elm_object_item_data_get(gl_item); if (strcmp(song_data->path, "/Add Songs using the 'Songs' Button!") == 0) return; pos = song_data->type; if (!randomize) { song_index = pos; path = path_songs[song_index]; } else { //get the value of song_index such that seq[song_index] = pos for (i=0; itype; old_song = gl_item; } int set_duration(void) { char *dur = "\0", cmd[255], *tok, tystr[3]; int ret, min, sec; ssize_t read; size_t len = 0; //get song duration sprintf(cmd, "get_time_length\n"); ret = write(fd, cmd, strlen(cmd)); //read data from mplayer output while(strncmp(dur, "ANS_LENGTH", 10) != 0) { read = getline(&dur, &len, mp_data); //printf("%s", dur); //check for alsa error for bluetooth streaming if (bt && strncmp(dur, "[AO_ALSA]", 9) == 0) { //tell mplayer to quit ret = write(fd, "quit 1\n", 7); //popup message popup_message("Bluetooth Error!", "Cannot Stream over Bluetooth!", 1); bt = 0; //restart mplayer restart_mplayer(); return 0; } if (strncmp(dur, "- MPlayer crashed", 17) == 0) { //printf("Mplayer Crashed...Restarting"); //song_index ++; restart_mplayer(); return 0; } } strcat(dur, "="); tok = strtok(dur, "="); tok = strtok(NULL, "="); song_dur = atoi(tok); min = song_dur / 60; sec = song_dur % 60; if (sec < 10) sprintf(tystr, "0%d", sec); else sprintf(tystr, "%d", sec); sprintf(cmd, "%d:%s", min, tystr); //printf("%s\n", cmd); elm_slider_min_max_set(pos_slider, 0, (double)song_dur); elm_object_text_set(play_dur, cmd); //TODO : this is not working on desktops return 1; } void show_song_info(void) { char *path, *tystr, buf[255]; int n, ret; //get the cover img if it exists if (randomize) path = path_songs[seq[song_index]]; else path = path_songs[song_index]; //check for cover art based on song name strcpy(buf, path); n = strlen(buf); buf[n-3] = 'j'; buf[n-2] = 'p'; buf[n-1] = 'g'; ret = check_file_exists (buf); //check for cover.jpg if (!ret) { tystr = strrchr(path, '/'); tystr++; n = strlen(path) - strlen(tystr); strncpy(buf, path, n); buf[n] = '\0'; strcat(buf, "cover.jpg"); ret = check_file_exists (buf); } //use the default image if (!ret) snprintf(buf, sizeof(buf), "%s/no-album-art.jpg", intone_dir); //album-art image elm_image_file_set(im, buf, NULL); //get the song and artist names from the db set_song_info(); //set the labels elm_object_text_set(artist_lb, cur_artist); if(strlen(cur_song) > 36) { strncpy(buf, cur_song, 34); buf[34] = '.'; buf[35] = '.'; buf[36] = '\0'; elm_object_text_set(song_lb, buf); } else elm_object_text_set(song_lb, cur_song); } void show_song_lyrics(void) { char buf[PATH_MAX], *path, *data, line[260]; int n, ret; FILE *lyric_file; //get the lyrics file if it exists elm_entry_entry_set(lyrics_entry, ""); if (randomize) path = path_songs[seq[song_index]]; else path = path_songs[song_index]; n = strlen(path); strcpy(buf, path); buf[n-3] = 't'; buf[n-2] = 'x'; buf[n-1] = 't'; ret = check_file_exists (buf); if (ret) { lyric_file = fopen(buf, "r"); while ((data = fgets(line, sizeof line, lyric_file))) { n = strlen(line); strcpy(buf, line); buf[n-1] = '\0'; strcat(buf, "
"); elm_entry_entry_insert(lyrics_entry, buf); } elm_scroller_region_show(lyrics_sc, 0, 0, 0, 0); } else elm_entry_entry_set(lyrics_entry, "No Lyrics File Found"); //get the song and artist names from the db set_song_info(); //set the labels elm_object_text_set(artist_lb, cur_artist); if(strlen(cur_song) > 36) { strncpy(buf, cur_song, 34); buf[34] = '.'; buf[35] = '.'; buf[36] = '\0'; elm_object_text_set(song_lb, buf); } else elm_object_text_set(song_lb, cur_song); //close the file fclose(lyric_file); } void prev_button_clicked(void *data, Evas_Object *obj, void *event_info) { int ret; char *path = NULL, cmd[255]; if((strlen(cur_playlist) < 1) || (strcmp(cur_playlist, "Select a Playlist!") == 0)) return; if (pos_time > 5) { //tell mplayer to seek to beginning of this song sprintf(cmd, "seek 0 2\n"); ret = write(fd, cmd, strlen(cmd)); } else { song_index -= 1; if (song_index < 0) { song_index = 0; return; } if(view == LISTVIEW) { elm_genlist_item_update(old_song); if(!randomize) { elm_genlist_item_selected_set(song_list[song_index+1], 0); elm_genlist_item_selected_set(song_list[song_index], 1); elm_genlist_item_update(song_list[song_index]); old_song = song_list[song_index]; elm_genlist_item_show(song_list[song_index], ELM_GENLIST_ITEM_SCROLLTO_IN); } else {//if randomize elm_genlist_item_selected_set(song_list[seq[song_index+1]], 0); elm_genlist_item_selected_set(song_list[seq[song_index]], 1); elm_genlist_item_update(song_list[seq[song_index]]); old_song = song_list[seq[song_index]]; elm_genlist_item_show(song_list[seq[song_index]], ELM_GENLIST_ITEM_SCROLLTO_IN); } } else if (view == ALBUM_ART) show_song_info(); else if (view == LYRICS) show_song_lyrics(); if (play_state == IDLE) return; if(timer1) ecore_timer_del(timer1); if (randomize) path = path_songs[seq[song_index]]; else path = path_songs[song_index]; ret = check_file_exists(path); if (!ret) { elm_object_item_disabled_set(song_list[song_index], EINA_TRUE); next_button_clicked (NULL, NULL, NULL); return; } elm_object_text_set(play_cur_pos, "0:00"); //tell mplayer to play cur_song sprintf(cmd, "loadfile \"%s\"\n", path); ret = write(fd, cmd, strlen(cmd)); ret = set_duration(); timer1 = ecore_timer_add(1.0, timer_func, NULL); } //set timer pos_time = 0; play_state = PLAYING; } void next_button_clicked(void *data, Evas_Object *obj, void *event_info) { int ret, i; char *path = NULL, cmd[255]; if((strlen(cur_playlist) < 1) || (strcmp(cur_playlist, "Select a Playlist!") == 0)) return; if(next_song_random) { //set song index such that while next song is playing, rev brings us back to this song if (randomize == 0) { for (i=0; i no_songs -1) { if (loop == 0) { song_index = no_songs -1; return; } else song_index = 0; } if(view == LISTVIEW) { elm_genlist_item_update(old_song); if (!randomize) { if (song_index > 0) elm_genlist_item_selected_set(song_list[song_index-1], 0); else elm_genlist_item_selected_set(song_list[no_songs -1], 0); elm_genlist_item_selected_set(song_list[song_index], 1); elm_genlist_item_update(song_list[song_index]); old_song = song_list[song_index]; elm_genlist_item_show(song_list[song_index], ELM_GENLIST_ITEM_SCROLLTO_IN); } else { // if randomize if(song_index > 0) elm_genlist_item_selected_set(song_list[seq[song_index -1]], 0); else elm_genlist_item_selected_set(song_list[seq[no_songs -1]], 0); elm_genlist_item_selected_set(song_list[seq[song_index]], 1); elm_genlist_item_update(song_list[seq[song_index]]); old_song = song_list[seq[song_index]]; elm_genlist_item_show(song_list[seq[song_index]], ELM_GENLIST_ITEM_SCROLLTO_IN); } } else if (view == ALBUM_ART) show_song_info(); else if (view == LYRICS) show_song_lyrics(); if (play_state == IDLE) return; if(timer1) ecore_timer_del(timer1); if (randomize) path = path_songs[seq[song_index]]; else path = path_songs[song_index]; ret = check_file_exists(path); if (ret) { //set timer pos_time = 0; timer1 = ecore_timer_add(1.0, timer_func, NULL); elm_object_text_set(play_cur_pos, "0:00"); play_state = PLAYING; //tell mplayer to play cur_song sprintf(cmd, "loadfile \"%s\"\n", path); ret = write(fd, cmd, strlen(cmd)); ret = set_duration(); } else { elm_object_item_disabled_set(song_list[song_index], EINA_TRUE); if (song_index >= no_songs - 1 && loop == 0) { //end of playlist elm_slider_value_set(pos_slider, 0.0); play_state = IDLE; return; } next_button_clicked (NULL, NULL, NULL); } } void play_button_clicked(void *data, Evas_Object *obj, void *event_info) { int ret, pos; char *path = NULL, cmd[255], buf[PATH_MAX]; if (play_state == PLAYING) { ret = write(fd, "pause\n", 6); ecore_timer_freeze(timer1); play_state = PAUSE; //restore system vol in case user wants to use phone sprintf(cmd, "amixer -qc 0 set PCM %d%s", sys_vol, "\%\n"); ret = system(cmd); //restore bass sprintf(cmd, "amixer -qc 0 set Bass 0\n"); ret = system(cmd); //restore treble sprintf(cmd, "amixer -qc 0 set Treble 0\n"); ret = system(cmd); //change icon to play snprintf(buf, sizeof(buf), "%s/play.png", intone_dir); elm_icon_file_set(ic_play, buf, NULL); return; } if (play_state == PAUSE) { ret = write(fd, "pause\n", 6); ecore_timer_thaw(timer1); play_state = PLAYING; //restore intone volume sprintf(cmd, "amixer -qc 0 set PCM %d%s", vol, "\%\n"); ret = system(cmd); //restore bass sprintf(cmd, "amixer -qc 0 set Bass %d\n", bass); ret = system(cmd); //restore treble sprintf(cmd, "amixer -qc 0 set Treble %d\n", treble); ret = system(cmd); //change icon to pause snprintf(buf, sizeof(buf), "%s/pause.png", intone_dir); elm_icon_file_set(ic_play, buf, NULL); return; } if (play_state == IDLE) { if((strlen(cur_playlist) < 1) || (strcmp(cur_playlist, "Select a Playlist!") == 0)) return; //get path for the current song if (randomize) path = path_songs[seq[song_index]]; else path = path_songs[song_index]; if (strcmp(path, "") == 0) return; //set up song index pos = get_song_pos(path_songs[song_index]); ret = check_file_exists(path); if (!ret) { if (!randomize) elm_object_item_disabled_set(song_list[song_index], EINA_TRUE); else elm_object_item_disabled_set(song_list[seq[song_index]], EINA_TRUE); song_index = pos - 1; play_state = PLAYING; // TODO : if last file in the playlist (and missing) stop else next if (song_index >= no_songs - 1) { //end of playlist elm_slider_value_set(pos_slider, 0.0); play_state = IDLE; return; } next_button_clicked (NULL, NULL, NULL); return; } //tell mplayer to play cur_song sprintf(cmd, "loadfile \"%s\"\n", path); ret = write(fd, cmd, strlen(cmd)); //if seek value exists and user has not selected any other song if ((seek) && ((pos - 1) == song_index)) { pos_time = seek; sprintf(cmd, "seek %d 2\n", pos_time); ret = write(fd, cmd, strlen(cmd)); } else { song_index = pos - 1; //song_index starts at 0 //set pos time pos_time = 0; } //set play state play_state = PLAYING; ret = set_duration(); //to prevent going to next song after starting with a paused state if (!ret) return; if (view == LISTVIEW) { elm_genlist_item_update(song_list[song_index]); elm_genlist_item_show(song_list[song_index], ELM_GENLIST_ITEM_SCROLLTO_IN); old_song = song_list[song_index]; } else if(view == ALBUM_ART) show_song_info(); else if(view == LYRICS) show_song_lyrics(); //change icon to pause snprintf(buf, sizeof(buf), "%s/pause.png", intone_dir); elm_icon_file_set(ic_play, buf, NULL); timer1 = ecore_timer_add(1.0, timer_func, NULL); elm_object_text_set(play_cur_pos, "0:00"); } } void vol_changed(void *data, Evas_Object *obj, void *event_info) { char volume[32]; double val; int ret; val = elm_slider_value_get(obj); vol = (int)val; sprintf(volume, "amixer -qc 0 set PCM %d%s", vol, "\%\n"); ret = system(volume); } void pos_changed_start(void *data, Evas_Object *obj, void *event_info) { if(timer1) ecore_timer_freeze(timer1); } void pos_changed(void *data, Evas_Object *obj, void *event_info) { double val; int ret; char pos[15]; val = elm_slider_value_get(obj); pos_time = val + 1; //actual pos is a fraction of sec more sprintf(pos, "seek %d 2\n", pos_time); ret = write(fd, pos, strlen(pos)); if (timer1) ecore_timer_thaw(timer1); } int file_select(const struct dirent *entry) { if ((strcmp(entry->d_name, ".") == 0) || (strcmp(entry->d_name, "..") == 0) || (strncmp(entry->d_name,".",1) == 0)) return 0; else return 1; } void load_dir(Evas_Object *li, char *direc) { int n, i; struct dirent **eps; char buf[255], old_dir[255], buf1[255]; Elm_Object_Item *dir_list=NULL; strcpy(old_dir, direc); snprintf(buf, sizeof(buf), "%s/folder.png", intone_dir); snprintf(buf1, sizeof(buf1), "%s/generic.png", intone_dir); n = scandir (old_dir, &eps, file_select, alphasort); if (n > 0) { //clear the list elm_genlist_clear(li); for (i = 0; i < n; ++i) { if(strcmp(old_dir, "/") == 0) sprintf(dir_gl_entry[i].path, "/%s", eps[i]->d_name); else sprintf(dir_gl_entry[i].path, "%s/%s", old_dir, eps[i]->d_name); dir_gl_entry[i].type = eps[i]->d_type; dir_list = elm_genlist_item_append(li, &itc_dir_list, &dir_gl_entry[i], NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); if(eps[i]->d_type != DT_DIR) elm_object_item_disabled_set(dir_list, EINA_TRUE); } } else return; free(eps); dir_list = elm_genlist_first_item_get(li); elm_genlist_item_selected_set(dir_list ,1); } int audio_file_select(const struct dirent *entry) { char *ok; if ((ok = strstr(entry->d_name, ".mp3")) || (ok = strstr(entry->d_name, ".m4a")) || (ok = strstr(entry->d_name, ".wma")) || (ok = strstr(entry->d_name, ".oga")) || (ok = strstr(entry->d_name, ".ogg")) || (ok = strstr(entry->d_name, ".wav")) || (ok = strstr(entry->d_name, ".flac")) || (ok = strstr(entry->d_name, ".MP3")) || (ok = strstr(entry->d_name, ".M4A")) || (ok = strstr(entry->d_name, ".WMA")) || (ok = strstr(entry->d_name, ".OGA")) || (ok = strstr(entry->d_name, ".OGG")) || (ok = strstr(entry->d_name, ".WAV")) || (ok = strstr(entry->d_name, ".FLAC"))) return 1; else return 0; } int check_audio_files(char *path) { struct dirent **eps; int n; n = scandir(path, &eps, audio_file_select, alphasort); if (n > 0) return 1; else return 0; } void list_dir(char *direc) { int n, flag=0, co=1, ret=0, j=0; char dir_nm[254], *ty=NULL, tystr[254], path[254], *root_dir=NULL, st_path[254]; char *ok=NULL, name[254], scan_dir[254], ty_tystr[254]; struct dirent **eps; struct stat statdata; tystr[0] = '\0'; dir_nm[0] = '\0'; path[0] = '\0'; scan_dir[0] = '\0'; n = scandir (direc, &eps, file_select, alphasort); if (n) { int i; for (i = 0; i < n; ++i) { if(eps[i]->d_type == DT_UNKNOWN) { sprintf(st_path, "%s/%s", direc, eps[i]->d_name); stat(st_path, &statdata); eps[i]->d_type = (statdata.st_mode >> 12) & 15; } if(eps[i]->d_type == DT_DIR) { sprintf(scan_dir, "%s/%s", direc, eps[i]->d_name); list_dir(scan_dir); //reset tystr to cater for value set in recursion strcpy(scan_dir, ""); } else { //if some files exist other than directories if (flag == 0) { // first time around - generate the playlist name strcpy(dir_nm, direc); ty = strrchr(direc, '/'); ty ++; root_dir = strdup(ty); ty = strtok(dir_nm, "/"); while ((ty = strtok (NULL, "/")) != NULL) { co ++; if (co == depth) root_dir = strdup(ty); if (co > depth) { // add artist name to playlist name if (strcmp(tystr, "") == 0) { strcpy (tystr, ty); } else { strcpy(ty_tystr, tystr); sprintf(tystr, "%s - %s", ty_tystr, ty); } } } //set flag to prevent regeneration of playlist name flag = 1; //set playlist name for files in the selected directory if (strcmp(direc, songs_dir) == 0) strcpy(tystr, root_dir); //check at least 1 file is of the type we recognise ret = check_audio_files(direc); if (ret) { // add the playlist to playlist table add_playlist(tystr); albums_scanned ++; } } sprintf(path, "%s/%s", direc, eps[i]->d_name); //check that file is a song if ((ok = strstr(path, ".mp3")) || (ok = strstr(path, ".m4a")) || (ok = strstr(path, ".oga")) || (ok = strstr(path, ".ogg")) || (ok = strstr(path, ".wav")) || (ok = strstr(path, ".wma")) || (ok = strstr(path, ".flac")) || (ok = strstr(path, ".MP3")) || (ok = strstr(path, ".M4A")) || (ok = strstr(path, ".OGA")) || (ok = strstr(path, ".OGG")) || (ok = strstr(path, ".WAV")) || (ok = strstr(path, ".WMA")) || (ok = strstr(path, ".FLAC")) ) { strcpy(name, eps[i]->d_name); j = strlen(name); name[j-4] = '\0'; add_songs(tystr, name, path);//only adds recognised files //printf("%s\n", path); songs_scanned++; } } } } free(root_dir); } void up_button_clicked(void *data, Evas_Object *obj, void *event_info) { char tystr[254], ty[254]; int i, flag=0; Evas_Object *l = data; Elm_Object_Item *gl_item = (Elm_Object_Item *)elm_genlist_selected_item_get(l); _dir *dir_gl = (_dir *)elm_object_item_data_get(gl_item); char *path = dir_gl->path; if(strcmp(path, "/") == 0) strcpy(tystr, path); else { int n = strlen(path); strcpy(ty, path); for(i=n-1; i>0; i--) { if (ty[i] == '/') { if (flag == 1) break; else flag = 1; } } if (i == 0) strcpy(tystr, "/"); else { strncpy(tystr, ty, i); tystr[i] = '\0'; } } load_dir(l, tystr); } void priority_changed(void *data, Evas_Object *obj, void *event_info) { char Prio[32]; double val; int ret; val = elm_slider_value_get(obj); priority = (int)val; sprintf(Prio, "renice %d %d\n", priority, pid); ret = system(Prio); } void bass_changed(void *data, Evas_Object *obj, void *event_info) { char Bass[32]; double val; int ret; val = elm_slider_value_get(obj); bass = (int)val; sprintf(Bass, "amixer -qc 0 set Bass %d\n", bass); ret = system(Bass); } void treble_changed(void *data, Evas_Object *obj, void *event_info) { char Treble[32]; double val; int ret; val = elm_slider_value_get(obj); treble = (int)val; sprintf(Treble, "amixer -qc 0 set Treble %d\n", treble); ret = system(Treble); } void bt_tg(void *data, Evas_Object *obj, void *event_info) { char *path, cmd[255]; int ret, restart = 0, pause = 0; //char buf[255], line[10], *ans; //FILE *fp; if (bt) bt = 0; else bt = 1; //printf("bt - %d\n", bt); if (bt) { //load module uinput for bluetooth headset controls ret = system("modprobe uinput"); bluetooth_on(); } else { //printf("switching off bluetooth\n"); bluetooth_off(); } //if state is playing - restart song on bt if (play_state != IDLE) { if (play_state == PAUSE) pause = 1; restart = 1; //freeze timer ecore_timer_freeze(timer1); play_state = PAUSE; //printf("pausing...\n"); } //tell mplayer to quit ret = write(fd, "quit 1\n", 7); //restart mplayer restart_mplayer(); //tell mplayer to do appropriate action if (restart) { //tell new mplayer process to play song path = path_songs[song_index]; sprintf(cmd, "loadfile \"%s\"\n", path); ret = write(fd, cmd, strlen(cmd)); //seek to pos_time sprintf(cmd, "seek %d 2\n", pos_time); ret = write(fd, cmd, strlen(cmd)); if (!PAUSE) { //thaw timer ecore_timer_thaw(timer1); play_state = PLAYING; } } } void random_tg(void *data, Evas_Object *obj, void *event_info) { char buf[255]; int temp; temp = next_song_random; if(temp) next_song_random = 0; else next_song_random = 1; //set shuffle icon if (next_song_random) snprintf(buf, sizeof(buf), "%s/shuffle.png", intone_dir); else snprintf(buf, sizeof(buf), "%s/no-shuffle.png", intone_dir); elm_icon_file_set(ic_shuffle, buf, NULL); } void set_random_mode(void *data, Evas_Object *obj, void *event_info) { char buf[255], *mode; mode = (char *)data; evas_object_hide(shuffle_hv); if (strcmp(mode, "random") == 0) { random_tg(NULL, NULL, NULL); return; } else if (strcmp(mode, "artist") == 0) snprintf(buf, sizeof(buf), "%s/artist-shuffle.png", intone_dir); else if (strcmp(mode, "album") == 0) snprintf(buf, sizeof(buf), "%s/album-shuffle.png", intone_dir); if (strcmp(mode, "song") == 0) snprintf(buf, sizeof(buf), "%s/song-shuffle.png", intone_dir); elm_icon_file_set(ic_shuffle, buf, NULL); //if random mode on - switch it off next_song_random = 0; strcpy(order_by, mode); populate_main_list(list); } void finger_tg(void *data, Evas_Object *obj, void *event_info) { if (finger == SMALL) finger = LARGE; else finger = SMALL; } void playlist_song_tg(void *data, Evas_Object *obj, void *event_info) { if(pl_info) pl_info = 0; else pl_info = 1; //refresh main list populate_main_list (list); } void loop_tg(void *data, Evas_Object *obj, void *event_info) { char buf[255]; if(loop == 0) loop =1; else loop =0; //set repeat icon if (loop) snprintf(buf, sizeof(buf), "%s/repeat.png", intone_dir); else snprintf(buf, sizeof(buf), "%s/no-repeat.png", intone_dir); elm_icon_file_set(ic_repeat, buf, NULL); } void rescan_button_clicked(void *data, Evas_Object *obj, void *event_info) { int ret; pthread_t thread_id; Evas_Object *li = (Evas_Object *) data; Elm_Object_Item *gl_item = elm_genlist_selected_item_get(li); if(!gl_item) return; strcpy(songs_dir, (char *)elm_object_item_data_get(gl_item)); //add albums and songs update message popup_message("Adding Songs .... Please Wait !!", NULL, 0); scanning = 1; scan_timer = ecore_timer_add(1.0, update_scan_popup, NULL); ret = pthread_create(&thread_id, NULL, (void *)song_scan, NULL); } /*************define del_pl****************/ char (*del_pl)[255]=NULL; void remove_dir_button_clicked(void *data, Evas_Object *obj, void *event_info) { int i, count, ret; char *ty, buf[255]; Evas_Object *li = (Evas_Object *) data; Elm_Object_Item *gl_item = elm_genlist_selected_item_get(li); if(!gl_item) return; ty = (char *) elm_object_item_data_get(gl_item); strcpy(songs_dir, ty); count = remove_song_dir(songs_dir); for (i=0; ipath); } void del_playlist_button_clicked(void *data, Evas_Object *obj, void *event_info) { //TODO: ask user if he is sure Evas_Object *li = data; Elm_Object_Item *gl_item = (Elm_Object_Item *)elm_genlist_selected_item_get(li); if (!gl_item) return; char *list_name = (char *)elm_object_item_data_get(gl_item); if (strcmp(list_name, "0 All Songs") == 0) return; begin_transaction (); del_playlist(list_name); commit_transaction (); //remove entry from li elm_object_item_del(gl_item); //change cur_playlist strcpy(cur_playlist, "0 All Songs"); populate_main_list(list); populate_play_list (play_list); } void sel_playlist_button_clicked(void *data, Evas_Object *obj, void *event_info) { int ret; char buf[255]; //stop playing current song if playing / paused if (play_state == PLAYING) ret = write(fd, "pause\n", 6); play_state = IDLE; //del timer if(timer1) ecore_timer_del(timer1); //reset song index to 0 song_index = 0; //set the selected playlist as the currrent one Evas_Object *li = data; Elm_Object_Item *gl_item = (Elm_Object_Item *)elm_genlist_selected_item_get(li); if (!gl_item) return; char *list_name = (char *)elm_object_item_data_get(gl_item); strcpy(cur_playlist, list_name); if(strcmp(cur_playlist, "ty_playlist") == 0) strcpy(buf, "Selected Songs"); else strcpy(buf, cur_playlist); elm_win_title_set(win, buf); set_no_songs(); if(randomize) randomize_list (); //update the main list if(view != LISTVIEW) change_view_list(); populate_main_list (list); //reset the pos_slider elm_slider_value_set(pos_slider, 0.0); elm_slider_min_max_set(pos_slider, 0, 0); elm_object_text_set(play_cur_pos, "0:00"); //change play icon snprintf(buf, sizeof(buf), "%s/play.png", intone_dir); elm_icon_file_set(ic_play, buf, NULL); } void edit_playlist_button_clicked(void *data, Evas_Object *obj, void *event_info) { Evas_Object *li = data; Elm_Object_Item *gl_item = (Elm_Object_Item *)elm_genlist_selected_item_get(li); if (!gl_item) return; char *list_name = (char *) elm_object_item_data_get(gl_item); if (strcmp(list_name, "0 All Songs") == 0) return; create_playlist_page((void *)list_name, NULL, NULL); } void remove_songs_button_clicked(void *data, Evas_Object *obj, void *event_info) { Evas_Object *li = data; const Eina_List *item; while((item = elm_genlist_selected_items_get(li))) { char *path = (char *)elm_object_item_data_get(item->data); if (path) free(path); elm_object_item_del(item->data); } } void save_playlist_button_clicked(void *data, Evas_Object *obj, void *event_info) { const Elm_Object_Item *gl_item; Evas_Object *entry = data; char *pl = (char *)elm_entry_entry_get(entry); //remove the trailing
char *playlist = strtok(pl, "<"); //check there is some data in the playlist before adding gl_item = elm_genlist_first_item_get(c_play_list); if(!gl_item) { popup_message ("Please add Songs to the Playlist before Saving!", NULL, 1); return; } begin_transaction (); save_playlist(playlist, c_play_list); commit_transaction (); //update playlists list populate_play_list (play_list); //popup message popup_message("Playlist Saved!", NULL, 1); //close the create playlist page } void add_album_button_clicked(void *data, Evas_Object *obj, void *event_info) { //get album names and add songs to c_play_list Evas_Object *li = data; const Eina_List *item; while((item = elm_genlist_selected_items_get(li))) { char *album = (char *)elm_object_item_data_get(item->data); add_songs_from_album(album, c_play_list); if (album) free(album); elm_object_item_del(item->data); } } intone-0.77+git20120308/src/callbacks.h000066400000000000000000000052121172615526600172340ustar00rootroot00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * callbacks.h * Copyright (C) chaitanya chandel 2009 * * callbacks.h is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * callbacks.h is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "db_sqlite.h" #include #define SMALL 0 #define LARGE 1 double keypress_time; extern int *seq, no_songs, fd, pid, priority, bt, play_state, depth, songs_scanned, albums_scanned, scanning; extern char order_by[254]; extern Ecore_Timer *timer1; extern FILE *mp_data; extern pthread_t thread_id; extern Evas_Object *set_page_win, *play_cur_pos, *play_dur, *pos_slider, *ic_play, *im, *song_lb, *artist_lb, *lyrics_entry, *songs_dir_lb; extern Evas_Object *ic_shuffle, *ic_repeat, *select_songs_page_win, *sel_songs_win, *manage_songs_page_win, *popup_lb, *popup_bt; extern Evas_Object *lyrics_sc, *list_box, *ic_view, *c_play_list, *home_list, *shuffle_hv; extern Ecore_Timer *scan_timer; extern void next_button_clicked(void *data, Evas_Object *obj, void *event_info); extern void prev_button_clicked(void *data, Evas_Object *obj, void *event_info); extern void play_button_clicked(void *data, Evas_Object *obj, void *event_info); extern void start_mplayer(void); extern void popup_message(char *message, char *msg, int butt_state); extern int check_file_exists(char *path); extern void set_song_info(void); extern void bluetooth_on(void); extern void bluetooth_off(void); extern void setup_ty_playlist(Evas_Object *li); extern void toggle_view (void *data, Evas_Object *obj, void *event_info); extern void create_playlist_page(void *data, Evas_Object *obj, void *event_info); extern void add_song_dir(char *path); extern int remove_song_dir(char *path); extern void create_manage_playlist_page(void); extern void populate_home_list(Evas_Object *li); void restart_normal_mplayer(void); void show_song_info(void); void show_song_lyrics(void); int set_duration(void); void song_select_play(void *data, Evas_Object *obj, void *event_info); Eina_Bool update_scan_popup(void *); void song_scan(void); void temp_playlist(void *data, Evas_Object *obj, void *event_info); intone-0.77+git20120308/src/db_sqlite.c000066400000000000000000001110171172615526600172570ustar00rootroot00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) chaitanya chandel 2009 * * db_sqlite.c is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * db_sqlite.c is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "db_sqlite.h" #include #include #include #include int check_file_exists(char *path) { struct stat sts; if(stat(path, &sts) == -1 && ENOENT) return 0; else return 1; } void save_state(void) { int db_ret; char *err, *sql_st=NULL, *sql; //set this up as a transaction sqlite3_exec(songs, "BEGIN", 0, 0, 0); //clear up the state table sql = "DELETE FROM state;"; db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "1 SQL error: %s\n", err); sqlite3_free(err); } } if (play_state == PAUSE) seek = pos_time; else seek = 0; //save cur_playlist, song_index, vol sql_st = sqlite3_mprintf("INSERT INTO state(playlist, song_no, volume, seek, dur, loop, finger, random, bass, treble, priority, version, bt) VALUES('%q', %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d);", cur_playlist, song_index, vol, seek, song_dur, loop, finger, randomize, bass, treble, priority, version, bt); //printf("%s\n", sql_st); db_ret = sqlite3_exec(songs, sql_st, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "2 SQL error: %s\n", err); sqlite3_free(err); } } //end transaction sqlite3_exec(songs, "COMMIT", 0, 0, 0); sqlite3_free(sql_st); } void first_run(void) { char *sql, *err; int db_ret; //create tables sql ="CREATE TABLE state(key integer primary key, playlist text, song_no integer, volume integer, seek integer, dur integer, loop integer, finger integer, random integer, bass integer, treble integer, priority integer, version integer, bt integer);"; db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "3 SQL error: %s\n", err); sqlite3_free(err); } } sql = "CREATE TABLE playlists(key INTEGER PRIMARY KEY, name text, artist text);"; db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "4 SQL error: %s\n", err); sqlite3_free(err); } } // add default values sql ="INSERT INTO playlists(name) VALUES('0 All Songs');"; db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "5 SQL error: %s\n", err); sqlite3_free(err); } } sql = "CREATE TABLE '0 All Songs'(key integer primary key, song text, artist text, duration integer, path text, album text);"; db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "6 SQL error: %s\n", err); sqlite3_free(err); } } sql = "CREATE TABLE 'ty_playlist'(key integer primary key, song text, path text);"; db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "7 SQL error: %s\n", err); sqlite3_free(err); } } sql = "CREATE TABLE 'song_dirs'(key integer primary key, dir text)"; db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "8 SQL error: %s\n", err); sqlite3_free(err); } } // add default values sql = "INSERT INTO state(playlist, song_no, volume, seek, dur, loop, finger, random, bass, treble, priority, version, bt) VALUES('Select a Playlist!', 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0)"; db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "9 SQL error: %s\n", err); sqlite3_free(err); } } //set up environment values sprintf(cur_playlist, "Select a Playlist!"); song_index = 0; vol = 80; view = LISTVIEW; version = 63; } void modify_state(void) { char *sql, *err; int db_ret; const char *tail; sqlite3_stmt *stmt; //get the songs_dir sql = "SELECT songs_dir FROM state"; db_ret = sqlite3_prepare(songs, sql, strlen(sql), &stmt, &tail); if(db_ret != SQLITE_OK) { //printf("10 SQL error: %d %s\n", db_ret, sqlite3_errmsg(songs)); } else { db_ret = sqlite3_step(stmt); if (db_ret == SQLITE_ROW) { if (sqlite3_column_text(stmt, 0)) sprintf(songs_dir, "%s", sqlite3_column_text(stmt, 0)); else strcpy(songs_dir, "Select a Playlist!"); } } sqlite3_finalize(stmt); //create song_dirs table sql = "CREATE TABLE 'song_dirs'(key integer primary key, dir text)"; db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "11 SQL error: %s\n", err); sqlite3_free(err); } } //insert song directory in new table sql = sqlite3_mprintf("INSERT INTO song_dirs(dir) VALUES('%q')", songs_dir); db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "12 SQL error: %s\n", err); sqlite3_free(err); } } sqlite3_free(sql); sqlite3_exec(songs, "BEGIN", 0, 0, 0); //modify state table sql ="DROP TABLE state"; db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "13 SQL error: %s\n", err); sqlite3_free(err); } } sql ="CREATE TABLE state(key integer primary key, playlist text, song_no integer, volume integer, seek integer, dur integer, loop integer, finger integer, random integer, bass integer, treble integer, priority integer, version integer, bt integer)"; db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "14 SQL error: %s\n", err); sqlite3_free(err); } } sql = sqlite3_mprintf("INSERT INTO state(playlist, song_no, volume, seek, dur, loop, finger, random, bass, treble, priority, version, bt) VALUES('%q', %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d);", cur_playlist, song_index, vol, seek, song_dur, loop, finger, randomize, bass, treble, priority, 63, bt); db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "15 SQL error: %s\n", err); sqlite3_free(err); } } sqlite3_free(sql); sqlite3_exec(songs, "COMMIT", 0, 0, 0); version = 63; } void restore_state(void) { int db_ret, ret; char *sql, volume[254], db[254], *ans, line[254]; const char *tail; sqlite3_stmt *stmt; FILE *fp; //set intone directory sprintf(intone_dir, "/usr/share/intone"); //get the users home directory const char *name = "HOME"; sprintf(home_dir, "%s", getenv(name)); sprintf(db, "%s/.intone/intone_songs.db", home_dir); //connect to the db db_ret = sqlite3_open(db, &songs); if (db_ret == SQLITE_ERROR || db_ret == SQLITE_CANTOPEN) { //printf("16 SQL error: %s\n", sqlite3_errmsg(songs)); //printf("Creating new db file\n"); //exit(1); ret = system("mkdir ~/.intone"); sqlite3_close(songs); db_ret = sqlite3_open(db, &songs); } //get the db version sql = "SELECT version FROM state"; db_ret = sqlite3_prepare(songs, sql, strlen(sql), &stmt, &tail); if(db_ret != SQLITE_OK) { if (strcmp(sqlite3_errmsg(songs), "no such table: state")==0) first_run(); //printf("16.5 SQL error: %d %s\n", db_ret, sqlite3_errmsg(songs)); } else { db_ret = sqlite3_step(stmt); if (db_ret == SQLITE_ROW) { version = sqlite3_column_int(stmt, 0); } } sqlite3_finalize(stmt); //printf("db ver %d\n", version); if (version < 63) modify_state(); //load the state data from state table sql = "SELECT * FROM state"; db_ret = sqlite3_prepare(songs, sql, strlen(sql), &stmt, &tail); if(db_ret != SQLITE_OK) { //printf("17 SQL error: %d %s\n", db_ret, sqlite3_errmsg(songs)); } else { //set up environment variables while((db_ret = sqlite3_step(stmt)) == SQLITE_ROW) { sprintf(cur_playlist, "%s", sqlite3_column_text(stmt, 1)); song_index = sqlite3_column_int(stmt, 2); //cater for sqlite saving -1 sometimes if (song_index < 0) song_index = 0; vol = sqlite3_column_int(stmt, 3); seek = sqlite3_column_int(stmt, 4); song_dur = sqlite3_column_int(stmt, 5); loop = sqlite3_column_int(stmt, 6); finger = sqlite3_column_int(stmt, 7); randomize = sqlite3_column_int(stmt, 8); bass = sqlite3_column_int(stmt, 9); treble = sqlite3_column_int(stmt, 10); priority = sqlite3_column_int(stmt, 11); version = sqlite3_column_int(stmt, 12); bt = sqlite3_column_int(stmt, 13); } } sqlite3_finalize(stmt); //for the first time set dynamic arrays to a value so that they can be freed by set_no_songs path_songs = calloc(1, sizeof(*path_songs)); //song_list = calloc(1, sizeof(*song_list)); pl_data = (_dir *) malloc(sizeof(_dir) * 1); //set up no_songs if ((strlen(cur_playlist) > 1) && (strcmp(cur_playlist, "Select a Playlist!") != 0)) set_no_songs(); if(song_index > no_songs - 1) song_index = no_songs - 1; //set up the random sequence randomize_list(); if(randomize) { next_song_random = 1; seek = 0; song_index = 0; } //get the sys_vol pcm fp = popen("amixer -c 0 get PCM", "r"); while ((ans = fgets(line, sizeof line, fp))) { if (strncmp(ans, " Front Right", 13) == 0) { char s_v[4]; char *tok = strtok(ans, "["); tok = strtok(NULL, "["); strncpy(s_v, tok, 4); sys_vol = atoi(s_v); } } pclose(fp); //set the volume sprintf(volume, "amixer -qc 0 set PCM %d%s", vol, "\%\n"); db_ret = system(volume); } void set_no_songs(void) { int db_ret; char *sql; const char *tail; sqlite3_stmt *stmt; sql = sqlite3_mprintf("SELECT COUNT(song) FROM '%q'", cur_playlist); db_ret = sqlite3_prepare(songs, sql, strlen(sql), &stmt, &tail); if(db_ret != SQLITE_OK) { //printf("18 SQL error: %s\n", sqlite3_errmsg(songs)); } db_ret = sqlite3_step(stmt); if (db_ret == SQLITE_ROW) no_songs = sqlite3_column_int(stmt, 0); else { //printf("19 SQL error: %s\n", sqlite3_errmsg(songs)); } sqlite3_free(sql); sqlite3_finalize(stmt); //free dynamic arrays free(path_songs); //free(song_list); free(pl_data); //set up the dynamic arrays for path_songs and song_list path_songs = calloc(no_songs, sizeof(*path_songs)); //song_list = calloc(no_songs, sizeof(*song_list)); pl_data = (_dir *) malloc(sizeof(_dir) * no_songs); } int add_playlist(char *playlist) { int db_ret, num; char *err, *sql_st=NULL; const char *tail; sqlite3_stmt *stmt; //check whether playlist already exists sql_st = sqlite3_mprintf("SELECT COUNT(name) FROM playlists where name = '%q';", playlist); db_ret = sqlite3_prepare(songs, sql_st, strlen(sql_st), &stmt, &tail); if(db_ret != SQLITE_OK) { //printf("20 SQL error: %s\n", sqlite3_errmsg(songs)); } db_ret = sqlite3_step(stmt); if (db_ret == SQLITE_ROW) num = sqlite3_column_int(stmt, 0); else { //printf("21 SQL error: %s\n", sqlite3_errmsg(songs)); return 2; } sqlite3_free(sql_st); sqlite3_finalize(stmt); //if playlist exists - empty it for rescan if (num) { // empty playlist sql_st = sqlite3_mprintf("DELETE FROM '%q';", playlist); db_ret = sqlite3_exec(songs, sql_st, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "22 SQL error: %s\n", err); sqlite3_free(err); } } sqlite3_free(sql_st); return 0; } else { //add playlist sql_st = sqlite3_mprintf("INSERT INTO playlists(name) VALUES('%q');", playlist); db_ret = sqlite3_exec(songs, sql_st, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "23 SQL error: %s\n", err); sqlite3_free(err); } } sqlite3_free(sql_st); sql_st = sqlite3_mprintf("CREATE TABLE '%q'(key INTEGER PRIMARY KEY, song text, artist text, duration integer, path text, album text);", playlist); db_ret = sqlite3_exec(songs, sql_st, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "24 SQL error: %s\n", err); sqlite3_free(err); } } sqlite3_free(sql_st); return 1; } } void begin_transaction(void) { sqlite3_exec(songs, "BEGIN", 0, 0, 0); } void commit_transaction(void) { sqlite3_exec(songs, "COMMIT", 0, 0, 0); } void get_song_tag_mp3(char *filename) { char file_nm[510]; int len; ID3Tag *tag; if ((tag = ID3Tag_New()) != NULL) { ID3Tag_LinkWithFlags(tag, filename, ID3TT_ID3V1); //patch by Steven **-4 ID3TagIterator *iter=NULL; ID3Frame *frame; ID3_FrameID id; while (NULL != (frame = ID3TagIterator_GetNext(iter))) { id = ID3Frame_GetID(frame); ID3Field *field; char tag_data[1024]=""; switch(id) { case ID3FID_TITLE : if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { ID3Field_GetASCII(field, tag_data, 1024); strcpy(tag_song, tag_data); } else strcpy(tag_song, ""); break; case ID3FID_LEADARTIST : if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { ID3Field_GetASCII(field, tag_data, 1024); strcpy(tag_artist, tag_data); } else strcpy(tag_artist, ""); break; case ID3FID_ALBUM : if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { ID3Field_GetASCII(field, tag_data, 1024); strcpy(tag_album, tag_data); } else strcpy(tag_album, ""); break; case ID3FID_PICTURE : //get type of pic if ((field = ID3Frame_GetField(frame, ID3FN_MIMETYPE)) != NULL) { ID3Field_GetASCII(field, tag_data, 1024); } //printf("%s\n", tag_data); strcpy(file_nm, filename); len = strlen(file_nm); if(strcmp(tag_data, "image/jpeg") == 0) { file_nm[len-3] = 'j'; file_nm[len-2] = 'p'; file_nm[len-1] = 'g'; } else if(strcmp(tag_data, "image/png") == 0) { file_nm[len-3] = 'p'; file_nm[len-2] = 'n'; file_nm[len-1] = 'g'; } //save image as filename . pic type if ((field = ID3Frame_GetField(frame, ID3FN_DATA)) != NULL) { ID3Field_ToFile(field, file_nm); } break; default : break; } } ID3TagIterator_Delete(iter); } else { strcpy(tag_artist, ""); strcpy(tag_song, ""); strcpy(tag_album, ""); } } /*void get_song_tag_mp3(char *filename) { ID3Tag *tag; if ((tag = ID3Tag_New()) != NULL) { ID3Frame *frame; (void) ID3Tag_LinkWithFlags(tag, filename, ID3TT_ID3V1); //patch by Steven **-4 if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TITLE)) != NULL) { ID3Field *field; if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { char title[1024]; (void) ID3Field_GetASCII(field, title, 1024); strcpy(tag_song, title); } else strcpy(tag_song, ""); } else strcpy(tag_song, ""); if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_LEADARTIST)) != NULL) { ID3Field *field; if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { char artist[1024]; (void) ID3Field_GetASCII(field, artist, 1024); strcpy(tag_artist, artist); } else strcpy(tag_artist, ""); } else strcpy(tag_artist, ""); if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_ALBUM)) != NULL) { ID3Field *field; if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { char album[1024]; (void) ID3Field_GetASCII(field, album, 1024); strcpy(tag_album, album); } else strcpy(tag_album, ""); } else strcpy(tag_album, ""); } else { strcpy(tag_artist, ""); strcpy(tag_song, ""); strcpy(tag_album, ""); } }*/ void get_song_tag_ogg (char *filename) { OggVorbis_File vf; FILE *ogg_file; int i,j; char *ok, *tystr; ogg_file = fopen(filename, "r"); if(ov_open(ogg_file, &vf, NULL, 0) < 0) { //printf("Input does not appear to be an Ogg bitstream.\n"); return; } char **ptr=ov_comment(&vf,-1)->user_comments; i = ov_comment(&vf,-1)->comments; for(j=0; j0;i--) { if(dirty[i] ==' ' || dirty[i] == '\'') len ++; else break; } strncpy(clean, dirty, ty - len + 1); clean[ty - len + 1] = '\0'; strcpy(dirty, clean); tystr = dirty; //remove leading spaces and apostrophe for(i=0; idata); //add to the table sql = sqlite3_mprintf("INSERT INTO ty_playlist(song, path) VALUES('%q', '%q');", da->name, da->path); db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "46 SQL error: %s\n", err); sqlite3_free(err); } } elm_object_item_del(item->data); } sqlite3_free(sql); } void set_song_info(void) { int db_ret; char *sql, *path, s_artist[255]; sqlite3_stmt *stmt; const char *tail; //get data from the database about the song if (randomize) path = path_songs[seq[song_index]]; else path = path_songs[song_index]; sql = sqlite3_mprintf("SELECT song, artist FROM '%q' WHERE path = '%q'", cur_playlist, path); db_ret = sqlite3_prepare(songs, sql, strlen(sql), &stmt, &tail); if(db_ret != SQLITE_OK) { //printf("47 SQL error: %s\n", sqlite3_errmsg(songs)); } db_ret = sqlite3_step(stmt); if (db_ret == SQLITE_ROW) { sprintf(cur_song, "%s", sqlite3_column_text(stmt, 0)); if (sqlite3_column_text(stmt, 1)) { sprintf(s_artist, "%s", sqlite3_column_text(stmt, 1)); if (strcmp(s_artist, "(NULL)") == 0) strcpy(cur_artist, ""); else strcpy(cur_artist, s_artist); } } sqlite3_free(sql); sqlite3_finalize(stmt); } void populate_home_list(Evas_Object *li) { int db_ret; char *sql, path[255], *pa; sqlite3_stmt *stmt; const char *tail; elm_genlist_clear(li); sql = "SELECT dir FROM song_dirs"; db_ret = sqlite3_prepare(songs, sql, strlen(sql), &stmt, &tail); if(db_ret != SQLITE_OK) { //printf("48 SQL error: %s\n", sqlite3_errmsg(songs)); } while((db_ret = sqlite3_step(stmt)) == SQLITE_ROW) { if(sqlite3_column_text(stmt, 0)) sprintf(path, "%s", sqlite3_column_text(stmt, 0)); pa = strdup(path); elm_genlist_item_append(li, &itc_home_list, (char *)pa, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); } sqlite3_finalize(stmt); } void add_song_dir(char *path) { int db_ret, add=0; char *sql, *err; sqlite3_stmt *stmt; const char *tail; sql = sqlite3_mprintf("SELECT count(dir) FROM song_dirs WHERE dir='%q'", path); db_ret = sqlite3_prepare(songs, sql, strlen(sql), &stmt, &tail); if(db_ret != SQLITE_OK) { //printf("48.5 SQL error: %s\n", sqlite3_errmsg(songs)); } while((db_ret = sqlite3_step(stmt)) == SQLITE_ROW) { if(sqlite3_column_int(stmt, 0) == 0) add=1; } sqlite3_finalize(stmt); if(add) { sql = sqlite3_mprintf("INSERT INTO song_dirs(dir) VALUES('%q')", path); db_ret = sqlite3_exec(songs, sql, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "49 SQL error: %s\n", err); sqlite3_free(err); } } sqlite3_free(sql); } } int remove_song_dir(char *path) { char *sql, *sql1, name[255], *err; int db_ret, co, n_pl=0, i=0; sqlite3_stmt *stmt, *stmt1; const char *tail, *tail1; //get number of playlists as max no that might need to be deleted sql = "SELECT count(name) FROM playlists"; db_ret = sqlite3_prepare(songs, sql, strlen(sql), &stmt, &tail); if(db_ret != SQLITE_OK) { //printf("50 SQL error: %s\n", sqlite3_errmsg(songs)); } else { db_ret = sqlite3_step(stmt); if (db_ret == SQLITE_ROW) { n_pl = sqlite3_column_int(stmt, 0); } } sqlite3_finalize(stmt); //make the array of max size del_pl = calloc(n_pl, sizeof(*del_pl)); //get playlist names from playlists sql = "SELECT name FROM playlists"; db_ret = sqlite3_prepare(songs, sql, strlen(sql), &stmt, &tail); if(db_ret != SQLITE_OK) { //printf("51 SQL error: %s\n", sqlite3_errmsg(songs)); } while((db_ret = sqlite3_step(stmt)) == SQLITE_ROW) { if(sqlite3_column_text(stmt, 0)) sprintf(name, "%s", sqlite3_column_text(stmt, 0)); //select path from this playlist sql1 = sqlite3_mprintf("SELECT COUNT(path) FROM '%q' WHERE path LIKE '%q%%'", name, path); db_ret = sqlite3_prepare(songs, sql1, strlen(sql1), &stmt1, &tail1); if(db_ret != SQLITE_OK) { //printf("52 SQL error: %s\n", sqlite3_errmsg(songs)); } else { db_ret = sqlite3_step(stmt1); if (db_ret == SQLITE_ROW) { co = sqlite3_column_int(stmt1, 0); if (co) { //populate the dynamic array with the playlist names strcpy(del_pl[i], name); i++; }//co }//db_ret }//else sqlite3_finalize(stmt1); sqlite3_free(sql1); } sqlite3_finalize(stmt); //remove this entry from song_dirs sql1 = sqlite3_mprintf("DELETE FROM song_dirs WHERE dir = '%q'", path); db_ret = sqlite3_exec(songs, sql1, NULL, NULL, &err); if (db_ret != SQLITE_OK) { if (err != NULL) { //fprintf(stderr, "53 SQL error: %s\n", err); sqlite3_free(err); } } sqlite3_free(sql1); return i; } intone-0.77+git20120308/src/db_sqlite.h000066400000000000000000000063451172615526600172730ustar00rootroot00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) chaitanya chandel 2009 * * db_sqlite.h is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * db_sqlite.h is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include #include #include #define LISTVIEW 0 #define ALBUM_ART 1 #define LYRICS 2 #define IDLE -1 #define PLAYING 1 #define PAUSE 0 void save_state(void); void restore_state(void); int add_playlist(char *playlist); void add_songs(char *, char* , char*); void update_album_list(Elm_Genlist_Item_Class *cl, Evas_Object *li); void remove_album(char *album); void add_default_playlist(void); void populate_play_list(Evas_Object *list); void populate_playlist_songs(Evas_Object *list); void populate_main_list(Evas_Object *list); void populate_create_play_list(Evas_Object *list); int count_albums(void); int get_song_pos(char *path); void del_playlist(char *list); void save_playlist(char *playlist, Evas_Object *li); void begin_transaction(void); void commit_transaction(void); void add_songs_from_album(char *album, Evas_Object *list); void first_run(void); void set_no_songs(void); void populate_filter_list(char *type, Evas_Object *list); void populate_filter_final_list(char *type, char *name, Evas_Object *list); char *clean_string(char *str); extern void gl_sel(void *data, Evas_Object *obj, void *event_info); extern void song_select(void *data, Evas_Object *obj, void *event_info); extern void randomize_list (void); extern void start_mplayer_bt(void); extern void sel_playlist_button_clicked(void *data, Evas_Object *obj, void *event_info); extern char cur_playlist[254], (*path_songs)[254], songs_dir[254], cur_song[254], cur_artist[254], order_by[254]; extern int song_index, vol, no_songs, bass, treble, next_song_random, priority, pid, version, bt; extern Elm_Object_Item *song_list[10000], *old_song; extern Ecore_Timer *timer1; extern int pos_time, view, seek, pos_time, play_state, song_dur, finger, loop, randomize, *seq, sys_vol, pl_info; extern Elm_Genlist_Item_Class itc_list, itc_album_list, itc_c_play_list, itc_dir_list, itc_play_list, itc_add_album_list, itc_filter_list; extern Elm_Genlist_Item_Class itc_home_list, itc_filter_final; extern Evas_Object *play_list, *list, *ic_playlist, *ic_albums, *add_page_win, *manage_playlist_page_win, *win, *play_button; sqlite3 *songs; char home_dir[255], intone_dir[255], tag_artist[255], tag_song[255], tag_album[255]; char (*del_pl)[255]; typedef struct { char path[255]; int type; } _dir; extern _dir dir_gl_entry[254]; //directory entries genlist struct extern _dir *pl_data; //playlist entries struct typedef struct { char name[255]; char path[255]; } _str2; extern _str2 name_path[254]; intone-0.77+git20120308/src/dbus-stuff.c000066400000000000000000000103311172615526600173700ustar00rootroot00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) chaitanya chandel 2009 * * dbus-stuff.c is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * dbus-stuff.c is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "dbus-stuff.h" #include #include #include void occupy_cpu(void) { e_dbus_init(); conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); DBusMessage *msg; msg = dbus_message_new_method_call( "org.freesmartphone.ousaged", "/org/freesmartphone/Usage", "org.freesmartphone.Usage", "RequestResource" ); const char *resource = "CPU"; dbus_message_append_args (msg, DBUS_TYPE_STRING, &resource, DBUS_TYPE_INVALID); e_dbus_message_send(conn, msg, dbus_reply_cb, -1, NULL); dbus_message_unref(msg); } void release_cpu(void) { DBusMessage *msg; msg = dbus_message_new_method_call( "org.freesmartphone.ousaged", "/org/freesmartphone/Usage", "org.freesmartphone.Usage", "ReleaseResource" ); const char *resource = "CPU"; dbus_message_append_args (msg, DBUS_TYPE_STRING, &resource, DBUS_TYPE_INVALID); e_dbus_message_send(conn, msg, dbus_reply_cb, -1, NULL); dbus_message_unref(msg); } void dbus_reply_cb(void *data, DBusMessage *replymsg, DBusError *error) { if (dbus_error_is_set(error)) { //printf("Error: %s - %s\n", error->name, error->message); } } void incoming_call_listener(void) { e_dbus_signal_handler_add(conn, "org.freesmartphone.ogsmd", "/org/freesmartphone/GSM/Device", "org.freesmartphone.GSM.Call", "CallStatus", pause_on_call, NULL); } void pause_on_call(void *data, DBusMessage *msg) { int id, ret; char *status=NULL, ***prop, cmd[254]; DBusError *error=NULL; dbus_message_get_args(msg, error, DBUS_TYPE_INT32, &id, DBUS_TYPE_STRING, &status, DBUS_TYPE_ARRAY, &prop, DBUS_TYPE_INVALID); if ((strcmp(status, "incoming") == 0) && (play_state==PLAYING)) { play_button_clicked (NULL, NULL, NULL); PHONE = 1; //alsa state set automatically //elm_win_lower(win); } if ((strcmp(status, "outgoing") == 0) && (play_state==PLAYING)) { play_button_clicked (NULL, NULL, NULL); PHONE = 1; } if ((strcmp(status, "release") == 0) && (play_state==PAUSE) && (PHONE)) { sleep(3); //restore intone volume sprintf(cmd, "amixer -c 0 set PCM %d%s", vol, "\%\n"); ret = write(fd, cmd, strlen(cmd)); ret = system(cmd); //restore bass sprintf(cmd, "amixer -c 0 set Bass %d\n", bass); ret = write(fd, cmd, strlen(cmd)); ret = system(cmd); //restore treble sprintf(cmd, "amixer -c 0 set Treble %d\n", treble); ret = write(fd, cmd, strlen(cmd)); ret = system(cmd); PHONE = 0; play_button_clicked (NULL, NULL, NULL); } //TODO: get prop data too } void bluetooth_on(void) { DBusMessage *msg; msg = dbus_message_new_method_call( "org.freesmartphone.odeviced", "/org/freesmartphone/Device/PowerControl/Bluetooth", "org.freesmartphone.Device.PowerControl", "SetPower" ); int resource = 1; dbus_message_append_args (msg, DBUS_TYPE_BOOLEAN, &resource, DBUS_TYPE_INVALID); e_dbus_message_send(conn, msg, dbus_reply_cb, -1, NULL); dbus_message_unref(msg); } void bluetooth_off(void) { DBusMessage *msg; msg = dbus_message_new_method_call( "org.freesmartphone.odeviced", "/org/freesmartphone/Device/PowerControl/Bluetooth", "org.freesmartphone.Device.PowerControl", "SetPower" ); int resource = 0; dbus_message_append_args (msg, DBUS_TYPE_BOOLEAN, &resource, DBUS_TYPE_INVALID); e_dbus_message_send(conn, msg, dbus_reply_cb, -1, NULL); dbus_message_unref(msg); } intone-0.77+git20120308/src/dbus-stuff.h000066400000000000000000000024451172615526600174040ustar00rootroot00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) chaitanya chandel 2009 * * dbus-stuff.h is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * dbus-stuff.h is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include #include #define PLAYING 1 #define PAUSE 0 void occupy_cpu(void); void release_cpu(void); void incoming_call_listener(void); void pause_on_call(void *data, DBusMessage *msg); void dbus_reply_cb(void *data, DBusMessage *replymsg, DBusError *error); void bluetooth_on(void); void bluetooth_off(void); E_DBus_Connection *conn; extern void play_button_clicked(void *data, Evas_Object *obj, void *event_info); extern int play_state, vol, fd, bass, treble, PHONE; extern Evas_Object *win; intone-0.77+git20120308/src/gui.c000066400000000000000000001711101172615526600160750ustar00rootroot00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) chaitanya chandel 2009 * * gui.c is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * gui.c is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #define _GNU_SOURCE #include "gui.h" #include #include #include typedef struct _WinList { Evas_Object *win; Evas_Object *li; } Winlist; typedef struct _CharList { char *type; Evas_Object *li; } CharList; void pop_win_del(void *data, Evas_Object *obj, void *event_info) { if (scanning == 1) return; } void popup_message(char *message, char *msg, int butt_state) { Evas_Object *pop_win, *bg, *inwin, *vbox, *lb; static Winlist wl; pop_win = elm_win_add(NULL, "inwin", ELM_WIN_DIALOG_BASIC); elm_win_title_set(pop_win, "Message"); evas_object_smart_callback_add(pop_win, "delete,request", pop_win_del, NULL); bg = elm_bg_add(pop_win); elm_win_resize_object_add(pop_win, bg); evas_object_size_hint_weight_set(bg, 1.0, 1.0); evas_object_show(bg); inwin = elm_win_inwin_add(pop_win); elm_object_style_set(inwin, "minimal_vertical"); evas_object_show(inwin); vbox = elm_box_add(pop_win); elm_win_inwin_content_set(inwin, vbox); evas_object_show(vbox); popup_lb = elm_label_add(pop_win); elm_object_text_set(popup_lb, message); elm_box_pack_end(vbox, popup_lb); evas_object_show(popup_lb); lb = elm_label_add(pop_win); elm_object_text_set(lb, msg); elm_box_pack_end(vbox, lb); evas_object_show(lb); //add close button popup_bt = elm_button_add(pop_win); elm_object_text_set(popup_bt, "Done"); evas_object_size_hint_weight_set(popup_bt, 1.0, 1.0); evas_object_size_hint_align_set(popup_bt, 0.5, -1.0); elm_box_pack_end(vbox, popup_bt); if (butt_state) evas_object_show(popup_bt); wl.win = pop_win; wl.li = NULL; evas_object_smart_callback_add(popup_bt, "clicked", cancel_button_clicked, &wl); evas_object_resize(pop_win, 320, 240); evas_object_show(pop_win); } int cancel_alert(void *data, Evas_Object *obj, void *event_info) { Evas_Object *win = data; //close the window evas_object_del((Evas_Object *)win); return 0; } int ack_alert(void *data, Evas_Object *obj, void *event_info) { Evas_Object *win = data; //close the window evas_object_del((Evas_Object *)win); return 1; } void popup_alert(char *message) { Evas_Object *win, *bg, *inwin, *lb, *bt, *bt1; win = elm_win_add(NULL, "inwin", ELM_WIN_DIALOG_BASIC); elm_win_title_set(win, "Alert!"); elm_win_autodel_set(win, 1); bg = elm_bg_add(win); elm_win_resize_object_add(win, bg); evas_object_size_hint_weight_set(bg, 1.0, 1.0); evas_object_show(bg); inwin = elm_win_inwin_add(win); elm_object_style_set(inwin, "minimal_vertical"); evas_object_show(inwin); lb = elm_label_add(win); elm_object_text_set(lb,message); elm_win_inwin_content_set(inwin, lb); evas_object_show(lb); //add yes button bt = elm_button_add(win); elm_object_text_set(bt, "Yes"); evas_object_size_hint_weight_set(bt, 1.0, 1.0); evas_object_size_hint_align_set(bt, -1.0, -1.0); elm_box_pack_end(inwin, bt); evas_object_show(bt); evas_object_smart_callback_add(bt, "clicked", (void *)ack_alert, win); //add close button bt1 = elm_button_add(win); elm_object_text_set(bt1, "Done"); evas_object_size_hint_weight_set(bt1, 1.0, 1.0); evas_object_size_hint_align_set(bt1, -1.0, -1.0); elm_box_pack_end(inwin, bt1); evas_object_show(bt1); evas_object_smart_callback_add(bt1, "clicked", (void *)cancel_alert, win); evas_object_resize(win, 320, 240); evas_object_show(win); } void set_music_dir_button_clicked(void *data, Evas_Object *obj, void *event_info) { int ret; static Winlist wl1; Winlist *wl = data; Elm_Object_Item *gl_item = (Elm_Object_Item *)elm_genlist_selected_item_get(wl->li); _dir *dir_gl = (_dir *)elm_object_item_data_get(gl_item); if (dir_gl->type != DT_DIR) return; //set values for closing window wl1.li = wl->li; wl1.win = wl->win; cancel_button_clicked (&wl1, NULL, NULL); //set songs_dir strcpy(songs_dir, dir_gl->path); popup_message("Adding Songs .... Please Wait !!", NULL, 0); scanning = 1; scan_timer = ecore_timer_add(1.0, update_scan_popup, NULL); ret = pthread_create(&thread_id, NULL, (void *)song_scan, NULL); } void cancel_button_clicked(void *data, Evas_Object *obj, void *event_info) { Winlist *wl = data; //clear the list if (wl->li) elm_genlist_clear(wl->li); //close the window evas_object_del(wl->win); } char *album_gl_text_get(void *data, Evas_Object *obj, const char *part) { char tystr[254], *ty; char *label = (char *)data; sprintf(tystr, "%s", label); ty = strdup(tystr); return (ty); } Evas_Object *album_gl_content_get(void *data, Evas_Object *obj, const char *part) { char buf[PATH_MAX]; if (!strcmp(part, "elm.swallow.icon")) { Evas_Object *ic = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/album.png", intone_dir); elm_icon_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return ic; } return NULL; } Eina_Bool album_gl_state_get(void *data, Evas_Object *obj, const char *part) { return 0; } void album_gl_del(void *data, Evas_Object *obj) { } void create_add_alb_page(void *data, Evas_Object *obj, void *event_info) { Evas_Object *add_alb_win; add_alb_win = elm_win_add(NULL, "add_album_page", ELM_WIN_BASIC); elm_win_title_set(add_alb_win, "Add Albums"); Evas_Object *bg, *vbox, *hbox, *hbox1, *fr, *lb; Evas_Object *add_album_button, *cancel_button; static Winlist wl; //add background bg = elm_bg_add(add_alb_win); elm_win_resize_object_add(add_alb_win, bg); evas_object_size_hint_weight_set(bg, 1.0, 1.0); evas_object_show(bg); //add vbox 4 vbox = elm_box_add(add_alb_win); elm_win_resize_object_add(add_alb_win, vbox); evas_object_size_hint_weight_set(vbox, 1.0, 1.0); evas_object_show(vbox); // add button hbox hbox = elm_box_add(add_alb_win); elm_box_horizontal_set(hbox, 1); evas_object_size_hint_weight_set(hbox, 1.0, 0.0); evas_object_size_hint_align_set(hbox, -1.0, 0.0); elm_box_pack_end(vbox, hbox); evas_object_show(hbox); // add a frame fr = elm_frame_add(add_alb_win); elm_object_style_set(fr, "outdent_top"); evas_object_size_hint_weight_set(fr, 0.0, 0.0); evas_object_size_hint_align_set(fr, 0.0, -1.0); elm_box_pack_end(hbox, fr); evas_object_show(fr); // add a label lb = elm_label_add(add_alb_win); elm_object_text_set(lb, "Albums"); elm_object_content_set(fr, lb); evas_object_show(lb); //add list to vbox now add_album_list = elm_genlist_add(add_alb_win); elm_object_scale_set(add_album_list,1.0); elm_genlist_bounce_set(add_album_list, 0 ,0); evas_object_size_hint_weight_set(add_album_list, 1.0, 1.0); evas_object_size_hint_align_set(add_album_list, -1.0, -1.0); elm_genlist_multi_select_set(add_album_list, 1); elm_box_pack_end(vbox, add_album_list); evas_object_show(add_album_list); //genlist class defs itc_add_album_list.item_style = "default"; itc_add_album_list.func.text_get = album_gl_text_get; itc_add_album_list.func.content_get = album_gl_content_get; itc_add_album_list.func.state_get = album_gl_state_get; itc_add_album_list.func.del = album_gl_del; // add button hbox1 hbox1 = elm_box_add(add_alb_win); elm_box_horizontal_set(hbox1, 1); evas_object_size_hint_weight_set(hbox1, 1.0, 0.0); evas_object_size_hint_align_set(hbox1, -1.0, 0.0); elm_box_pack_end(vbox, hbox1); evas_object_show(hbox1); //add add_album button to hbox1 add_album_button = elm_button_add(add_alb_win); elm_object_text_set(add_album_button, "Add Selected"); evas_object_size_hint_weight_set(add_album_button, 1.0, 1.0); evas_object_size_hint_align_set(add_album_button, -1.0, -1.0); elm_box_pack_end(hbox1, add_album_button); evas_object_show(add_album_button); evas_object_smart_callback_add(add_album_button, "clicked", add_album_button_clicked, add_album_list); // add cancel button cancel_button = elm_button_add(add_alb_win); elm_object_text_set(cancel_button, "Done"); evas_object_size_hint_weight_set(cancel_button, 1.0, 1.0); evas_object_size_hint_align_set(cancel_button, -1.0, -1.0); elm_box_pack_end(hbox1, cancel_button); evas_object_show(cancel_button); wl.win = add_alb_win; wl.li = add_album_list; evas_object_smart_callback_add(cancel_button, "clicked", cancel_button_clicked, &wl); //set delete callback for this window evas_object_smart_callback_add(add_alb_win, "delete,request", cancel_button_clicked, &wl); update_album_list(&itc_add_album_list, add_album_list); evas_object_resize(add_alb_win, 480, 600); evas_object_show(add_alb_win); } static void my_hover_bt_1(void *data, Evas_Object *obj, void *event_info) { Evas_Object *hv = data; evas_object_show(hv); } char *gl_text_get(void *data, Evas_Object *obj, const char *part) { char tystr[254], *ty; _dir *song_data = (_dir *)data; if (pl_info){ ty = strrchr(path_songs[song_data->type], '/'); if (ty) { ty ++; sprintf(tystr, "%s", ty); } } else sprintf(tystr, "%s", song_data->path); ty = strdup(tystr); return (ty); } Evas_Object *gl_content_get(void *data, Evas_Object *obj, const char *part) { char buf[PATH_MAX]; if (!strcmp(part, "elm.swallow.icon")) { Evas_Object *ic = elm_icon_add(obj); _dir *song_data = (_dir *) data; snprintf(buf, sizeof(buf), "%s/song.png", intone_dir); if ((play_state != IDLE) && (randomize == 0) && (song_data->type == song_index )) snprintf(buf, sizeof(buf), "%s/play.png", intone_dir); if ((play_state != IDLE) && (randomize == 1) && (song_data->type == seq[song_index])) snprintf(buf, sizeof(buf), "%s/play.png", intone_dir); elm_icon_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return ic; } return NULL; } Eina_Bool gl_state_get(void *data, Evas_Object *obj, const char *part) { return 0; } void gl_del(void *data, Evas_Object *obj) { } void create_gui(Evas_Object *win) { //playlist page - default view is playlist view Evas_Object *bg, *hbox, *prev_button, *next_button, *playlist_button, *view_button; Evas_Object *bx, *bt, *shuffle_button; Evas_Object *toolbar, *vol_slider, *ic, *eq_button, *loop_button; char buf[PATH_MAX], hv_label[30], *tystr, ty[30]; int i; //add background bg = elm_bg_add(win); elm_win_resize_object_add(win, bg); evas_object_size_hint_weight_set(bg, 1.0, 1.0); evas_object_show(bg); evas_object_focus_set(bg, 1); evas_object_event_callback_add(bg, EVAS_CALLBACK_KEY_DOWN, key_press, NULL); //add vbox 4 vbox = elm_box_add(win); elm_win_resize_object_add(win, vbox); evas_object_size_hint_weight_set(vbox, 1.0, 1.0); evas_object_show(vbox); //toolbar hbox toolbar = elm_box_add(win); elm_box_horizontal_set(toolbar, 1); evas_object_size_hint_weight_set(toolbar, 1.0, 0.0); evas_object_size_hint_align_set(toolbar, -1.0, 0.0); elm_box_pack_end(vbox, toolbar); evas_object_show(toolbar); //add view button to the toolbar view_button = elm_button_add(win); ic_view = elm_icon_add(win); snprintf(buf, sizeof(buf), "%s/playlist_view.png", intone_dir); elm_icon_file_set(ic_view, buf, NULL); elm_object_content_set(view_button, ic_view); evas_object_size_hint_weight_set(view_button, 1.0, 1.0); evas_object_size_hint_align_set(view_button, -1.0, -1.0); elm_box_pack_end(toolbar, view_button); evas_object_show(view_button); evas_object_smart_callback_add(view_button, "clicked", toggle_view, NULL); //add settings button to the toolbar eq_button = elm_button_add(win); ic= elm_icon_add(win); snprintf(buf, sizeof(buf), "%s/settings.png", intone_dir); elm_icon_file_set(ic, buf, NULL); elm_object_content_set(eq_button, ic); evas_object_size_hint_weight_set(eq_button, 1.0, 1.0); evas_object_size_hint_align_set(eq_button, -1.0, -1.0); elm_box_pack_end(toolbar, eq_button); evas_object_show(eq_button); evas_object_smart_callback_add(eq_button, "clicked", create_set_page, NULL); //add songs button to the toolbar playlist_button = elm_button_add(win); elm_object_text_set(playlist_button, "Songs"); evas_object_size_hint_weight_set(playlist_button, 1.0, 1.0); evas_object_size_hint_align_set(playlist_button, -1.0, -1.0); elm_box_pack_end(toolbar, playlist_button); evas_object_show(playlist_button); evas_object_smart_callback_add(playlist_button, "clicked", (void *)manage_songs_page, list); //add hover for list shuffle to the toolbar shuffle_hv = elm_hover_add(win); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, 1.0, 1.0); evas_object_size_hint_align_set(bx, -1.0, -1.0); elm_box_pack_end(toolbar, bx); evas_object_show(bx); shuffle_button = elm_button_add(win); ic_shuffle = elm_icon_add(win); if (randomize) snprintf(buf, sizeof(buf), "%s/shuffle.png", intone_dir); else snprintf(buf, sizeof(buf), "%s/no-shuffle.png", intone_dir); elm_icon_file_set(ic_shuffle, buf, NULL); elm_object_content_set(shuffle_button, ic_shuffle); evas_object_smart_callback_add(shuffle_button, "clicked", my_hover_bt_1, shuffle_hv); evas_object_size_hint_weight_set(shuffle_button, 1.0, 1.0); evas_object_size_hint_align_set(shuffle_button, -1.0, -1.0); elm_box_pack_end(bx, shuffle_button); evas_object_show(shuffle_button); elm_hover_parent_set(shuffle_hv, win); elm_hover_target_set(shuffle_hv, shuffle_button); bt = elm_button_add(win); elm_object_text_set(bt, "---"); evas_object_size_hint_weight_set(bt, 1.0, 1.0); evas_object_size_hint_align_set(bt, -1.0, -1.0); elm_object_part_content_set(shuffle_hv, "middle", bt); evas_object_show(bt); bx = elm_box_add(win); //add 5 buttons for (i=1; i<6; i++) { bt = elm_button_add(win); switch(i) { case 1 : strcpy(hv_label, "File"); strcpy(ty, "none"); break; case 2 : strcpy(hv_label, "Album"); strcpy(ty, "album"); break; case 3 : strcpy(hv_label, "Artist"); strcpy(ty, "artist"); break; case 4 : strcpy(hv_label, "Song"); strcpy(ty, "song"); break; case 5 : strcpy(hv_label, "Random"); strcpy(ty, "random"); break; default : break; } elm_object_text_set(bt, hv_label); elm_box_pack_end(bx, bt); tystr = strdup(ty); evas_object_smart_callback_add(bt, "clicked", set_random_mode, (char *)tystr); evas_object_show(bt); } evas_object_show(bx); elm_object_part_content_set(shuffle_hv, "bottom", bx); /*random_button = elm_button_add(win); ic_shuffle = elm_icon_add(win); if (randomize) snprintf(buf, sizeof(buf), "%s/shuffle.png", intone_dir); else snprintf(buf, sizeof(buf), "%s/no-shuffle.png", intone_dir); elm_icon_file_set(ic_shuffle, buf, NULL); elm_object_content_set(random_button, ic_shuffle); evas_object_size_hint_weight_set(random_button, 1.0, 1.0); evas_object_size_hint_align_set(random_button, -1.0, -1.0); elm_box_pack_end(toolbar, random_button); evas_object_show(random_button); evas_object_smart_callback_add(random_button, "clicked", random_tg, NULL);*/ //add hover for play loop to the toolbar loop_button = elm_button_add(win); ic_repeat = elm_icon_add(win); if (loop) snprintf(buf, sizeof(buf), "%s/repeat.png", intone_dir); else snprintf(buf, sizeof(buf), "%s/no-repeat.png", intone_dir); elm_icon_file_set(ic_repeat, buf, NULL); elm_object_content_set(loop_button, ic_repeat); evas_object_size_hint_weight_set(loop_button, 1.0, 1.0); evas_object_size_hint_align_set(loop_button, -1.0, -1.0); elm_box_pack_end(toolbar, loop_button); evas_object_show(loop_button); evas_object_smart_callback_add(loop_button, "clicked", loop_tg, NULL); //add the list box list_box = elm_box_add(win); evas_object_size_hint_weight_set(list_box, 1.0, 1.0); evas_object_size_hint_align_set(list_box, -1.0, -1.0); elm_box_pack_end(vbox, list_box); evas_object_show(list_box); //add list to vbox now list = elm_genlist_add(win); elm_object_scale_set(list, 1.0); elm_genlist_bounce_set(list, 0, 0); evas_object_size_hint_weight_set(list, 1.0, 1.0); evas_object_size_hint_align_set(list, -1.0, -1.0); elm_genlist_multi_select_set(list, 0); elm_box_pack_end(list_box, list); evas_object_show(list); evas_object_smart_callback_add(list, "clicked", song_select_play, list); evas_object_smart_callback_add(list, "selected", song_select, list); //evas_object_event_callback_add(list, EVAS_CALLBACK_KEY_DOWN, key_press, NULL); //genlist class defs itc_list.item_style = "default"; itc_list.func.text_get = gl_text_get; itc_list.func.content_get = gl_content_get; itc_list.func.state_get = gl_state_get; itc_list.func.del = gl_del; //add hbox to vbox at pos 4 hbox = elm_box_add(win); elm_box_horizontal_set(hbox, 1); evas_object_size_hint_weight_set(hbox, 1.0, 0.0); evas_object_size_hint_align_set(hbox, -1.0, 0.0); elm_box_pack_end(vbox, hbox); evas_object_show(hbox); //add prev button to the hbox prev_button = elm_button_add(win); ic = elm_icon_add(win); snprintf(buf, sizeof(buf), "%s/prev.png", intone_dir); elm_icon_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_object_content_set(prev_button, ic); evas_object_show(ic); evas_object_size_hint_weight_set(prev_button, 1.0, 1.0); evas_object_size_hint_align_set(prev_button, -1.0, -1.0); elm_box_pack_end(hbox, prev_button); evas_object_show(prev_button); evas_object_smart_callback_add(prev_button, "clicked", prev_button_clicked, list); //add play button to the hbox play_button = elm_button_add(win); ic_play = elm_icon_add(win); snprintf(buf, sizeof(buf), "%s/play.png", intone_dir); elm_icon_file_set(ic_play, buf, NULL); evas_object_size_hint_aspect_set(ic_play, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_object_content_set(play_button, ic_play); evas_object_show(ic_play); evas_object_size_hint_weight_set(play_button, 1.0, 1.0); evas_object_size_hint_align_set(play_button, -1.0, -1.0); elm_box_pack_end(hbox, play_button); evas_object_show(play_button); evas_object_smart_callback_add(play_button, "clicked", play_button_clicked, list); //add next button to the hbox next_button = elm_button_add(win); ic = elm_icon_add(win); snprintf(buf, sizeof(buf), "%s/next.png", intone_dir); elm_icon_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_object_content_set(next_button, ic); evas_object_show(ic); evas_object_size_hint_weight_set(next_button, 1.0, 1.0); evas_object_size_hint_align_set(next_button, -1.0, -1.0); elm_box_pack_end(hbox, next_button); evas_object_show(next_button); evas_object_smart_callback_add(next_button, "clicked", next_button_clicked, list); //add vol slider to hbox vol_slider = elm_slider_add(win); elm_object_text_set(vol_slider, "Vol"); elm_slider_unit_format_set(vol_slider, "%3.0f"); elm_slider_indicator_format_set(vol_slider, "%3.0f"); elm_slider_min_max_set(vol_slider, 70, 100); elm_slider_value_set(vol_slider, vol); evas_object_size_hint_align_set(vol_slider, -1.0, 0.5); evas_object_size_hint_weight_set(vol_slider, 1.0, 1.0); elm_box_pack_end(hbox, vol_slider); evas_object_show(vol_slider); evas_object_smart_callback_add(vol_slider, "delay,changed", vol_changed, NULL); //add hbox to vbox hbox = elm_box_add(win); elm_box_horizontal_set(hbox, 1); evas_object_size_hint_weight_set(hbox, 1.0, 0.0); evas_object_size_hint_align_set(hbox, -1.0, 0.0); elm_box_pack_end(vbox, hbox); evas_object_show(hbox); //add cur pos label play_cur_pos = elm_label_add(win); elm_object_text_set(play_cur_pos, "0:00"); elm_box_pack_end(hbox, play_cur_pos); evas_object_show(play_cur_pos); //add position slider to hbox pos_slider = elm_slider_add(win); elm_slider_indicator_format_set(pos_slider, "%3.0f"); evas_object_size_hint_weight_set(pos_slider, 1.0, 0.0); evas_object_size_hint_align_set(pos_slider, -1.0, 0.0); elm_box_pack_end(hbox, pos_slider); elm_slider_min_max_set(pos_slider, 0, song_dur); //set to seconds elm_slider_value_set(pos_slider, (double)seek); evas_object_show(pos_slider); evas_object_smart_callback_add(pos_slider, "changed", pos_changed_start, NULL); evas_object_smart_callback_add(pos_slider, "delay,changed", pos_changed, NULL); //add total dur label label play_dur = elm_label_add(win); elm_object_text_set(play_dur, "0:00"); elm_box_pack_end(hbox, play_dur); evas_object_show(play_dur); //if seek set up duration if (seek) { int min,sec; char tystr[254], cmd[254]; min = song_dur / 60; sec = song_dur % 60; if (sec < 10) sprintf(tystr, "0%d", sec); else sprintf(tystr, "%d", sec); sprintf(cmd, "%d:%s", min, tystr); } // make window full screen evas_object_resize(win, 480, 600); //Populate the playlist populate_main_list(list); } char *dir_gl_text_get(void *data, Evas_Object *obj, const char *part) { _dir *dir_gl = (_dir *)data; char tystr[254], *ty; char *label = dir_gl->path; ty = strrchr(label, '/'); ty ++; sprintf(tystr, "%s", ty); ty = strdup(tystr); return (ty); } Evas_Object *dir_gl_content_get(void *data, Evas_Object *obj, const char *part) { _dir *dir_gl = (_dir *)data; char buf[PATH_MAX], buf1[PATH_MAX]; if (!strcmp(part, "elm.swallow.icon")) { Evas_Object *ic = elm_icon_add(obj); Evas_Object *ic1 = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/folder.png", intone_dir); snprintf(buf1, sizeof(buf1), "%s/generic.png", intone_dir); elm_icon_file_set(ic, buf, NULL); elm_icon_file_set(ic1, buf1, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); evas_object_size_hint_aspect_set(ic1, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); if (dir_gl->type == DT_DIR) return ic; else return ic1; } return NULL; } Eina_Bool dir_gl_state_get(void *data, Evas_Object *obj, const char *part) { return 0; } void dir_gl_del(void *data, Evas_Object *obj) { } void create_dir_browser_page(void *data, Evas_Object *obj, void *event_info) { //Evas_Object *dir_browser_page_win; dir_browser_page_win = elm_win_add(NULL, "sel_direc", ELM_WIN_BASIC); elm_win_title_set(dir_browser_page_win, "Set Music Home Directory"); Evas_Object *bg, *vbox, *hbox, *hbox1, *up_button, *home_button, *enter_dir_button; Evas_Object *cancel_button, *dir_list, *done_button; static Winlist wl; //add background bg = elm_bg_add(dir_browser_page_win); elm_win_resize_object_add(dir_browser_page_win, bg); evas_object_size_hint_weight_set(bg, 1.0, 1.0); evas_object_show(bg); //add vbox 3 vbox = elm_box_add(dir_browser_page_win); elm_win_resize_object_add(dir_browser_page_win, vbox); evas_object_size_hint_weight_set(vbox, 1.0, 1.0); evas_object_show(vbox); // add button hbox hbox = elm_box_add(dir_browser_page_win); elm_box_horizontal_set(hbox, 1); elm_box_homogeneous_set(hbox, 1); evas_object_size_hint_weight_set(hbox, 1.0, 0.0); evas_object_size_hint_align_set(hbox, -1.0, 0.0); elm_box_pack_end(vbox, hbox); evas_object_show(hbox); //add up button to hbox up_button = elm_button_add(dir_browser_page_win); elm_object_text_set(up_button, "Up"); evas_object_size_hint_weight_set(up_button, 1.0, 1.0); evas_object_size_hint_align_set(up_button, -1.0, -1.0); elm_box_pack_end(hbox, up_button); evas_object_show(up_button); //add home button to hbox home_button = elm_button_add(dir_browser_page_win); elm_object_text_set(home_button, "Home"); evas_object_size_hint_weight_set(home_button, 1.0, 1.0); evas_object_size_hint_align_set(home_button, -1.0, -1.0); elm_box_pack_end(hbox, home_button); evas_object_show(home_button); //add enter dir button to hbox enter_dir_button = elm_button_add(dir_browser_page_win); elm_object_text_set(enter_dir_button, "Enter Dir"); evas_object_size_hint_weight_set(enter_dir_button, 1.0, 1.0); evas_object_size_hint_align_set(enter_dir_button, -1.0, -1.0); elm_box_pack_end(hbox, enter_dir_button); evas_object_show(enter_dir_button); //add list to vbox now dir_list = elm_genlist_add(dir_browser_page_win); elm_object_scale_set(dir_list, 1.0); elm_genlist_bounce_set(dir_list, 0 ,0); evas_object_size_hint_weight_set(dir_list, 1.0, 1.0); evas_object_size_hint_align_set(dir_list, -1.0, -1.0); elm_genlist_multi_select_set(dir_list, 0); elm_box_pack_end(vbox, dir_list); evas_object_show(dir_list); evas_object_smart_callback_add(dir_list, "clicked", dir_list_select, dir_list); evas_object_smart_callback_add(up_button, "clicked", up_button_clicked, dir_list); evas_object_smart_callback_add(home_button, "clicked", home_button_clicked, dir_list); evas_object_smart_callback_add(enter_dir_button, "clicked", dir_list_select, dir_list); //genlist class defs itc_dir_list.item_style = "default"; itc_dir_list.func.text_get = dir_gl_text_get; itc_dir_list.func.content_get = dir_gl_content_get; itc_dir_list.func.state_get = dir_gl_state_get; itc_dir_list.func.del = dir_gl_del; // add button hbox1 hbox1 = elm_box_add(dir_browser_page_win); elm_box_horizontal_set(hbox1, 1); evas_object_size_hint_weight_set(hbox1, 1.0, 0.0); evas_object_size_hint_align_set(hbox1, -1.0, 0.0); elm_box_pack_end(vbox, hbox1); evas_object_show(hbox1); //add done button to hbox1 done_button = elm_button_add(dir_browser_page_win); elm_object_text_set(done_button, "Select Dir"); evas_object_size_hint_weight_set(done_button, 1.0, 1.0); evas_object_size_hint_align_set(done_button, -1.0, -1.0); elm_box_pack_end(hbox1, done_button); evas_object_show(done_button); wl.win = dir_browser_page_win; wl.li = dir_list; evas_object_smart_callback_add(done_button, "clicked", set_music_dir_button_clicked, &wl); //add cancel button to hbox1 cancel_button = elm_button_add(dir_browser_page_win); elm_object_text_set(cancel_button, "Cancel"); evas_object_size_hint_weight_set(cancel_button, 1.0, 1.0); evas_object_size_hint_align_set(cancel_button, -1.0, -1.0); elm_box_pack_end(hbox1, cancel_button); evas_object_show(cancel_button); evas_object_smart_callback_add(cancel_button, "clicked", cancel_button_clicked, &wl); //set delete callback for this window evas_object_smart_callback_add(dir_browser_page_win, "delete,request", cancel_button_clicked, &wl); //load directory data load_dir(dir_list, "/"); evas_object_resize(dir_browser_page_win, 480, 600); evas_object_show(dir_browser_page_win); } void select_all_songs(void *data, Evas_Object *obj, void *event_info) { Evas_Object *li = (Evas_Object *) data; Elm_Object_Item *gl_item; gl_item = elm_genlist_first_item_get(li); if (gl_item) elm_genlist_item_selected_set(gl_item, 1); while ((gl_item = elm_genlist_item_next_get(gl_item))) { elm_genlist_item_selected_set(gl_item, 1); } } char *final_filter_gl_text_get(void *data, Evas_Object *obj, const char *part) { char tystr[254], *ty; _str2 *filter_song = (_str2 *) data; sprintf(tystr, "%s", filter_song->name); ty = strdup(tystr); return (ty); } Evas_Object *final_filter_gl_content_get(void *data, Evas_Object *obj, const char *part) { char buf[PATH_MAX]; if (!strcmp(part, "elm.swallow.icon")) { Evas_Object *ic = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/playlist.png", intone_dir); elm_icon_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return ic; } return NULL; } Eina_Bool final_filter_gl_state_get(void *data, Evas_Object *obj, const char *part) { return 0; } void final_filter_gl_del(void *data, Evas_Object *obj) { } void select_songs_page(void *data, Evas_Object *obj, void *event_info) { CharList *cl = data; Elm_Object_Item *gl_item; char *name; gl_item = elm_genlist_selected_item_get(cl->li); if (!gl_item) return; name = (char *)elm_object_item_data_get(gl_item); //save a temporary playlist select_songs_page_win = elm_win_add(NULL, "select songs", ELM_WIN_BASIC); elm_win_title_set(select_songs_page_win, "Select Songs to Play"); Evas_Object *bg, *vbox, *hbox, *filter_final_list; Evas_Object *home_dir_button; Evas_Object *cancel_button; static Winlist wl; //add background bg = elm_bg_add(select_songs_page_win); elm_win_resize_object_add(select_songs_page_win, bg); evas_object_size_hint_weight_set(bg, 1.0, 1.0); evas_object_show(bg); //add vbox vbox = elm_box_add(select_songs_page_win); elm_win_resize_object_add(select_songs_page_win, vbox); evas_object_size_hint_weight_set(vbox, 1.0, 1.0); evas_object_show(vbox); // add list filter_final_list = elm_genlist_add(select_songs_page_win); elm_object_scale_set(filter_final_list, 1.0); elm_genlist_bounce_set(filter_final_list, 0 ,0); evas_object_size_hint_weight_set(filter_final_list, 1.0, 1.0); evas_object_size_hint_align_set(filter_final_list, -1.0, -1.0); elm_genlist_multi_select_set(filter_final_list, 1); elm_box_pack_end(vbox, filter_final_list); evas_object_show(filter_final_list); //genlist class defs itc_filter_final.item_style = "default"; itc_filter_final.func.text_get = final_filter_gl_text_get; itc_filter_final.func.content_get = final_filter_gl_content_get; itc_filter_final.func.state_get = final_filter_gl_state_get; itc_filter_final.func.del = final_filter_gl_del; // add hbox hbox = elm_box_add(select_songs_page_win); elm_box_horizontal_set(hbox, 1); evas_object_size_hint_weight_set(hbox, 1.0, 0.0); evas_object_size_hint_align_set(hbox, -1.0, 0.0); elm_box_pack_end(vbox, hbox); evas_object_show(hbox); //add create_playlist button to hbox home_dir_button = elm_button_add(select_songs_page_win); elm_object_text_set(home_dir_button, "Play Selected"); evas_object_size_hint_weight_set(home_dir_button, 1.0, 1.0); evas_object_size_hint_align_set(home_dir_button, -1.0, -1.0); elm_box_pack_end(hbox, home_dir_button); evas_object_show(home_dir_button); evas_object_smart_callback_add(home_dir_button, "clicked", (void *)temp_playlist, filter_final_list); //add create_playlist button to hbox home_dir_button = elm_button_add(select_songs_page_win); elm_object_text_set(home_dir_button, "Select All"); evas_object_size_hint_weight_set(home_dir_button, 1.0, 1.0); evas_object_size_hint_align_set(home_dir_button, -1.0, -1.0); elm_box_pack_end(hbox, home_dir_button); evas_object_show(home_dir_button); evas_object_smart_callback_add(home_dir_button, "clicked", (void *)select_all_songs, filter_final_list); //add cancel button to hbox cancel_button = elm_button_add(select_songs_page_win); elm_object_text_set(cancel_button, "Cancel"); evas_object_size_hint_weight_set(cancel_button, 1.0, 1.0); evas_object_size_hint_align_set(cancel_button, -1.0, -1.0); elm_box_pack_end(hbox, cancel_button); evas_object_show(cancel_button); wl.win = select_songs_page_win; wl.li = filter_final_list; evas_object_smart_callback_add(cancel_button, "clicked", cancel_button_clicked, &wl); //set delete callback for this window evas_object_smart_callback_add(select_songs_page_win, "delete,request", cancel_button_clicked, &wl); populate_filter_final_list(cl->type, name, filter_final_list); evas_object_resize(select_songs_page_win, 480, 600); evas_object_show(select_songs_page_win); } char *filter_gl_text_get(void *data, Evas_Object *obj, const char *part) { char tystr[254], *ty; char *label = (char *)data; sprintf(tystr, "%s", label); ty = strdup(tystr); return (ty); } Evas_Object *filter_gl_content_get(void *data, Evas_Object *obj, const char *part) { char buf[PATH_MAX]; if (!strcmp(part, "elm.swallow.icon")) { Evas_Object *ic = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/playlist.png", intone_dir); elm_icon_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return ic; } return NULL; } Eina_Bool filter_gl_state_get(void *data, Evas_Object *obj, const char *part) { return 0; } void filter_gl_del(void *data, Evas_Object *obj) { } void sel_songs_by_page(void *data, Evas_Object *obj, void *event_info) { char *type = (char *) data; //list with alphabetical listing of artists sel_songs_win = elm_win_add(NULL, "manage_songs", ELM_WIN_BASIC); elm_win_title_set(sel_songs_win, type); Evas_Object *bg, *vbox, *hbox, *filter_list; Evas_Object *home_dir_button; Evas_Object *cancel_button; static CharList cl; static Winlist wl; //add background bg = elm_bg_add(sel_songs_win); elm_win_resize_object_add(sel_songs_win, bg); evas_object_size_hint_weight_set(bg, 1.0, 1.0); evas_object_show(bg); //add vbox vbox = elm_box_add(sel_songs_win); elm_win_resize_object_add(sel_songs_win, vbox); evas_object_size_hint_weight_set(vbox, 1.0, 1.0); evas_object_show(vbox); // add list filter_list = elm_genlist_add(sel_songs_win); elm_object_scale_set(filter_list, 1.0); elm_genlist_bounce_set(filter_list, 0 ,0); evas_object_size_hint_weight_set(filter_list, 1.0, 1.0); evas_object_size_hint_align_set(filter_list, -1.0, -1.0); elm_genlist_multi_select_set(filter_list, 0); //till the popup_alert starts working elm_box_pack_end(vbox, filter_list); evas_object_show(filter_list); //genlist class defs itc_filter_list.item_style = "default"; itc_filter_list.func.text_get = filter_gl_text_get; itc_filter_list.func.content_get = filter_gl_content_get; itc_filter_list.func.state_get = filter_gl_state_get; itc_filter_list.func.del = filter_gl_del; // add hbox hbox = elm_box_add(sel_songs_win); elm_box_horizontal_set(hbox, 1); evas_object_size_hint_weight_set(hbox, 1.0, 0.0); evas_object_size_hint_align_set(hbox, -1.0, 0.0); elm_box_pack_end(vbox, hbox); evas_object_show(hbox); //add create_playlist button to hbox home_dir_button = elm_button_add(sel_songs_win); elm_object_text_set(home_dir_button, "Select"); evas_object_size_hint_weight_set(home_dir_button, 1.0, 1.0); evas_object_size_hint_align_set(home_dir_button, -1.0, -1.0); elm_box_pack_end(hbox, home_dir_button); evas_object_show(home_dir_button); cl.type = type; cl.li = filter_list; evas_object_smart_callback_add(home_dir_button, "clicked", (void *)select_songs_page, &cl); //add cancel button to hbox cancel_button = elm_button_add(sel_songs_win); elm_object_text_set(cancel_button, "Cancel"); evas_object_size_hint_weight_set(cancel_button, 1.0, 1.0); evas_object_size_hint_align_set(cancel_button, -1.0, -1.0); elm_box_pack_end(hbox, cancel_button); evas_object_show(cancel_button); wl.win = sel_songs_win; wl.li = filter_list; evas_object_smart_callback_add(cancel_button, "clicked", cancel_button_clicked, &wl); //set delete callback for this window evas_object_smart_callback_add(sel_songs_win, "delete,request", cancel_button_clicked, &wl); populate_filter_list(type, filter_list); evas_object_resize(sel_songs_win, 480, 600); evas_object_show(sel_songs_win); } void play_all_songs(void *data, Evas_Object *obj, void *event_info) { Winlist *wl = data; //clear the list if (wl->li) elm_genlist_clear(wl->li); //close the window evas_object_del(wl->win); strcpy(cur_playlist, "0 All Songs"); set_no_songs (); populate_main_list (list); elm_win_title_set(win, "All Songs"); } char *home_list_text_get(void *data, Evas_Object *obj, const char *part) { char tystr[254], *ty; char *label = (char *)data; sprintf(tystr, "%s", label); ty = strdup(tystr); return (ty); } Evas_Object *home_list_content_get(void *data, Evas_Object *obj, const char *part) { return NULL; } Eina_Bool home_list_state_get(void *data, Evas_Object *obj, const char *part) { return 0; } void home_list_del(void *data, Evas_Object *obj) { } void manage_songs_page(void *data, Evas_Object *obj, void *event_info) { manage_songs_page_win = elm_win_add(NULL, "manage_songs", ELM_WIN_BASIC); elm_win_title_set(manage_songs_page_win, "Songs"); Evas_Object *bg, *vbox, *hbox, *create_playlist_button; Evas_Object *fr, *lb, *home_dir_button, *rescan_button; Evas_Object *cancel_button; char *var; static Winlist wl; wl.win = manage_songs_page_win; wl.li = NULL; //add background bg = elm_bg_add(manage_songs_page_win); elm_win_resize_object_add(manage_songs_page_win, bg); evas_object_size_hint_weight_set(bg, 1.0, 1.0); evas_object_show(bg); //add vbox vbox = elm_box_add(manage_songs_page_win); elm_win_resize_object_add(manage_songs_page_win, vbox); evas_object_size_hint_weight_set(vbox, 1.0, 1.0); evas_object_show(vbox); // add a label lb = elm_label_add(manage_songs_page_win); elm_object_text_set(lb, "Song Directories"); elm_box_pack_end(vbox, lb); evas_object_show(lb); // add a list home_list = elm_genlist_add(manage_songs_page_win); elm_object_scale_set(home_list, 1.0); elm_genlist_bounce_set(home_list, 0 ,0); evas_object_size_hint_weight_set(home_list, 1.0, 1.0); evas_object_size_hint_align_set(home_list, -1.0, -1.0); elm_genlist_multi_select_set(home_list, 0); //till the popup_alert starts working elm_box_pack_end(vbox, home_list); evas_object_show(home_list); //genlist class defs itc_home_list.item_style = "default"; itc_home_list.func.text_get = home_list_text_get; itc_home_list.func.content_get = home_list_content_get; itc_home_list.func.state_get = home_list_state_get; itc_home_list.func.del = home_list_del; populate_home_list(home_list); // add a frame fr = elm_frame_add(manage_songs_page_win); elm_object_style_set(fr, "outdent_top"); evas_object_size_hint_weight_set(fr, 1.0, 0.0); //evas_object_size_hint_align_set(fr, 0.5, 0.0); elm_box_pack_end(vbox, fr); evas_object_show(fr); // add hbox hbox = elm_box_add(manage_songs_page_win); elm_box_horizontal_set(hbox, 1); elm_box_homogeneous_set(hbox, 1); evas_object_size_hint_weight_set(hbox, 1.0, 1.0); //evas_object_size_hint_align_set(hbox, -1.0, 0.0); elm_object_content_set(fr, hbox); evas_object_show(hbox); //add add dir button to hbox home_dir_button = elm_button_add(manage_songs_page_win); elm_object_text_set(home_dir_button, "Add Dir"); evas_object_size_hint_weight_set(home_dir_button, 1.0, 1.0); evas_object_size_hint_align_set(home_dir_button, -1.0, 0.0); elm_box_pack_end(hbox, home_dir_button); evas_object_show(home_dir_button); evas_object_smart_callback_add(home_dir_button, "clicked", (void *)create_dir_browser_page, NULL); //add rescan dir button to hbox rescan_button = elm_button_add(manage_songs_page_win); elm_object_text_set(rescan_button, "ReScan Dir"); evas_object_size_hint_weight_set(rescan_button, 1.0, 1.0); evas_object_size_hint_align_set(rescan_button, -1.0, 0.0); elm_box_pack_end(hbox, rescan_button); evas_object_show(rescan_button); evas_object_smart_callback_add(rescan_button, "clicked", (void *)rescan_button_clicked, home_list); //add remove dir button to hbox rescan_button = elm_button_add(manage_songs_page_win); elm_object_text_set(rescan_button, "Remove Dir"); evas_object_size_hint_weight_set(rescan_button, 1.0, 1.0); evas_object_size_hint_align_set(rescan_button, -1.0, 0.0); elm_box_pack_end(hbox, rescan_button); evas_object_show(rescan_button); evas_object_smart_callback_add(rescan_button, "clicked", (void *)remove_dir_button_clicked, home_list); //add all songs button to vbox create_playlist_button = elm_button_add(manage_songs_page_win); elm_object_text_set(create_playlist_button, "Play All Songs"); evas_object_size_hint_weight_set(create_playlist_button, 1.0, 0.0); evas_object_size_hint_align_set(create_playlist_button, -1.0, 0.0); elm_box_pack_end(vbox, create_playlist_button); evas_object_show(create_playlist_button); evas_object_smart_callback_add(create_playlist_button, "clicked", (void *)play_all_songs, &wl); //add select playlist button to vbox create_playlist_button = elm_button_add(manage_songs_page_win); elm_object_text_set(create_playlist_button, "Select Songs / Folder to Play"); evas_object_size_hint_weight_set(create_playlist_button, 1.0, 0.0); evas_object_size_hint_align_set(create_playlist_button, -1.0, 0.0); elm_box_pack_end(vbox, create_playlist_button); evas_object_show(create_playlist_button); evas_object_smart_callback_add(create_playlist_button, "clicked", (void *)create_manage_playlist_page, NULL); //add select artist button to hbox create_playlist_button = elm_button_add(manage_songs_page_win); elm_object_text_set(create_playlist_button, "Artists"); evas_object_size_hint_weight_set(create_playlist_button, 1.0, 0.0); evas_object_size_hint_align_set(create_playlist_button, -1.0, 0.0); elm_box_pack_end(vbox, create_playlist_button); evas_object_show(create_playlist_button); var = "Artists"; evas_object_smart_callback_add(create_playlist_button, "clicked", (void *)sel_songs_by_page, (char *)var); //add select album button to hbox cancel_button = elm_button_add(manage_songs_page_win); elm_object_text_set(cancel_button, "Done"); evas_object_size_hint_weight_set(cancel_button, 1.0, 0.0); evas_object_size_hint_align_set(cancel_button, -1.0, 0.0); elm_box_pack_end(vbox, cancel_button); evas_object_show(cancel_button); evas_object_smart_callback_add(cancel_button, "clicked", cancel_button_clicked, &wl); //set delete callback for this window evas_object_smart_callback_add(manage_songs_page_win, "delete,request", cancel_button_clicked, &wl); evas_object_resize(manage_songs_page_win, 480, 600); evas_object_show(manage_songs_page_win); } char *play_gl_text_get(void *data, Evas_Object *obj, const char *part) { char tystr[254], *ty; char *label = (char *)data; sprintf(tystr, "%s", label); ty = strdup(tystr); return (ty); } Evas_Object *play_gl_content_get(void *data, Evas_Object *obj, const char *part) { char buf[PATH_MAX]; if (!strcmp(part, "elm.swallow.icon")) { Evas_Object *ic = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/playlist.png", intone_dir); elm_icon_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return ic; } return NULL; } Eina_Bool play_gl_state_get(void *data, Evas_Object *obj, const char *part) { return 0; } void play_gl_del(void *data, Evas_Object *obj) { } void manage_done_clicked(void *data, Evas_Object *obj, void *event_info) { static Winlist wl1; Winlist *ty = data; wl1.win = ty->win; wl1.li = ty->li; //if((strlen(cur_playlist) > 1) && (strcmp(cur_playlist, "Select a Playlist!") != 0)) //sel_song(); cancel_button_clicked (&wl1, NULL, NULL); } void create_manage_playlist_page(void) { //Evas_Object *manage_playlist_page_win; manage_playlist_page_win = elm_win_add(NULL, "manage_playlist", ELM_WIN_BASIC); elm_win_title_set(manage_playlist_page_win, "Manage Playlists"); Evas_Object *bg, *vbox, *hbox, *create_playlist_button, *del_playlist_button; Evas_Object *sel_playlist_button, *edit_playlist_button, *cancel_button; char *pl_name = ""; static Winlist wl; //add background bg = elm_bg_add(manage_playlist_page_win); elm_win_resize_object_add(manage_playlist_page_win, bg); evas_object_size_hint_weight_set(bg, 1.0, 1.0); evas_object_show(bg); //add vbox vbox = elm_box_add(manage_playlist_page_win); elm_win_resize_object_add(manage_playlist_page_win, vbox); evas_object_size_hint_weight_set(vbox, 1.0, 1.0); evas_object_show(vbox); //add list play_list = elm_genlist_add(manage_playlist_page_win); elm_object_scale_set(play_list, 1.0); elm_genlist_bounce_set(play_list, 0 ,0); evas_object_size_hint_weight_set(play_list, 1.0, 1.0); evas_object_size_hint_align_set(play_list, -1.0, -1.0); elm_genlist_multi_select_set(play_list, 0); //till the popup_alert starts working elm_box_pack_end(vbox, play_list); evas_object_show(play_list); //genlist class defs itc_play_list.item_style = "default"; itc_play_list.func.text_get = play_gl_text_get; itc_play_list.func.content_get = play_gl_content_get; itc_play_list.func.state_get = play_gl_state_get; itc_play_list.func.del = play_gl_del; // add hbox hbox = elm_box_add(manage_playlist_page_win); elm_box_horizontal_set(hbox, 1); elm_box_homogeneous_set(hbox, 1); evas_object_size_hint_weight_set(hbox, 1.0, 0.0); evas_object_size_hint_align_set(hbox, -1.0, 0.0); elm_box_pack_end(vbox, hbox); evas_object_show(hbox); //add create_playlist button to hbox create_playlist_button = elm_button_add(manage_playlist_page_win); elm_object_text_set(create_playlist_button, "Add"); evas_object_size_hint_weight_set(create_playlist_button, 1.0, 1.0); evas_object_size_hint_align_set(create_playlist_button, -1.0, -1.0); elm_box_pack_end(hbox, create_playlist_button); evas_object_show(create_playlist_button); evas_object_smart_callback_add(create_playlist_button, "clicked", (void *)create_playlist_page, (char *)pl_name); //add del_playlist button to hbox del_playlist_button = elm_button_add(manage_playlist_page_win); elm_object_text_set(del_playlist_button, "Del"); evas_object_size_hint_weight_set(del_playlist_button, 1.0, 1.0); evas_object_size_hint_align_set(del_playlist_button, -1.0, -1.0); elm_box_pack_end(hbox, del_playlist_button); evas_object_show(del_playlist_button); evas_object_smart_callback_add(del_playlist_button, "clicked", del_playlist_button_clicked, play_list); //add edit_playlist button to hbox edit_playlist_button = elm_button_add(manage_playlist_page_win); elm_object_text_set(edit_playlist_button, "Edit"); evas_object_size_hint_weight_set(edit_playlist_button, 1.0, 1.0); evas_object_size_hint_align_set(edit_playlist_button, -1.0, -1.0); elm_box_pack_end(hbox, edit_playlist_button); evas_object_show(edit_playlist_button); evas_object_smart_callback_add(edit_playlist_button, "clicked", edit_playlist_button_clicked, play_list); //add edit_playlist button to hbox sel_playlist_button = elm_button_add(manage_playlist_page_win); elm_object_text_set(sel_playlist_button, "Select"); evas_object_size_hint_weight_set(sel_playlist_button, 1.0, 1.0); evas_object_size_hint_align_set(sel_playlist_button, -1.0, -1.0); elm_box_pack_end(hbox, sel_playlist_button); evas_object_show(sel_playlist_button); evas_object_smart_callback_add(sel_playlist_button, "clicked", sel_playlist_button_clicked, play_list); //add cancel button to hbox cancel_button = elm_button_add(manage_playlist_page_win); elm_object_text_set(cancel_button, "Done"); evas_object_size_hint_weight_set(cancel_button, 1.0, 1.0); evas_object_size_hint_align_set(cancel_button, -1.0, -1.0); elm_box_pack_end(hbox, cancel_button); evas_object_show(cancel_button); wl.win = manage_playlist_page_win; wl.li = play_list; evas_object_smart_callback_add(cancel_button, "clicked", cancel_button_clicked, &wl); //set delete callback for this window evas_object_smart_callback_add(manage_playlist_page_win, "delete,request", cancel_button_clicked, &wl); evas_object_resize(manage_playlist_page_win, 480, 600); evas_object_show(manage_playlist_page_win); //populate the playlist populate_play_list(play_list); } char *c_play_gl_text_get(void *data, Evas_Object *obj, const char *part) { char tystr[254], *ty; char *label = (char *)data; ty = strrchr(label, '/'); ty ++; sprintf(tystr, "%s", ty); ty = strdup(tystr); return (ty); } Evas_Object *c_play_gl_content_get(void *data, Evas_Object *obj, const char *part) { char buf[PATH_MAX]; if (!strcmp(part, "elm.swallow.icon")) { Evas_Object *ic = elm_icon_add(obj); snprintf(buf, sizeof(buf), "%s/song.png", intone_dir); elm_icon_file_set(ic, buf, NULL); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); return ic; } return NULL; } Eina_Bool c_play_gl_state_get(void *data, Evas_Object *obj, const char *part) { return 0; } void c_play_gl_del(void *data, Evas_Object *obj) { } void create_playlist_page(void *data, Evas_Object *obj, void *event_info) { Evas_Object *playlist_page_win; playlist_page_win = elm_win_add(NULL, "playlist", ELM_WIN_BASIC); elm_win_title_set(playlist_page_win, "Create Playlist"); elm_win_autodel_set(playlist_page_win, 1); Evas_Object *bg, *vbox, *fr, *lb, *hbox, *save_playlist_button, *cancel_button; Evas_Object *hbox1, *fr1, *lb1, *entry, *add_alb_button, *remove_songs_button; char *pl_name = data; static Winlist wl; //add background bg = elm_bg_add(playlist_page_win); elm_win_resize_object_add(playlist_page_win, bg); evas_object_size_hint_weight_set(bg, 1.0, 1.0); evas_object_show(bg); //add vbox 3 vbox = elm_box_add(playlist_page_win); elm_win_resize_object_add(playlist_page_win, vbox); evas_object_size_hint_weight_set(vbox, 1.0, 1.0); evas_object_show(vbox); // add hbox hbox = elm_box_add(playlist_page_win); elm_box_horizontal_set(hbox, 1); evas_object_size_hint_weight_set(hbox, 1.0, 0.0); evas_object_size_hint_align_set(hbox, -1.0, -1.0); elm_box_pack_end(vbox, hbox); evas_object_show(hbox); // add a frame fr = elm_frame_add(playlist_page_win); elm_object_style_set(fr, "outdent_top"); evas_object_size_hint_weight_set(fr, 0.0, 0.0); evas_object_size_hint_align_set(fr, 0.0, -1.0); elm_box_pack_end(hbox, fr); evas_object_show(fr); // add a label lb = elm_label_add(playlist_page_win); elm_object_text_set(lb, "Playlist:"); elm_object_content_set(fr, lb); evas_object_show(lb); //add an entry entry = elm_entry_add(playlist_page_win); evas_object_size_hint_weight_set(entry, 1.0, 0.0); evas_object_size_hint_align_set(entry, -1.0, 0.0); elm_entry_single_line_set(entry, 1); elm_entry_editable_set(entry, 1); elm_entry_line_wrap_set(entry, 0); elm_box_pack_end(hbox, entry); evas_object_show(entry); //add save playlist button to hboxsave_playlist_button_clicked save_playlist_button = elm_button_add(playlist_page_win); elm_object_text_set(save_playlist_button, "Save"); evas_object_size_hint_weight_set(save_playlist_button, 1.0, 1.0); evas_object_size_hint_align_set(save_playlist_button, 0.5, -1.0); elm_box_pack_end(hbox, save_playlist_button); evas_object_show(save_playlist_button); evas_object_smart_callback_add(save_playlist_button, "clicked", save_playlist_button_clicked, entry); // add a frame fr1 = elm_frame_add(playlist_page_win); elm_object_style_set(fr1, "outdent_top"); evas_object_size_hint_weight_set(fr1, 0.0, 0.0); evas_object_size_hint_align_set(fr1, 0.5, -1.0); elm_box_pack_end(vbox, fr1); evas_object_show(fr1); // add a label lb1 = elm_label_add(playlist_page_win); elm_object_text_set(lb1, "Songs"); elm_object_content_set(fr1, lb1); evas_object_show(lb1); //add list to vbox now c_play_list = elm_genlist_add(playlist_page_win); elm_object_scale_set(c_play_list, 1.0); elm_genlist_bounce_set(c_play_list, 0 ,0); evas_object_size_hint_weight_set(c_play_list, 1.0, 1.0); evas_object_size_hint_align_set(c_play_list, -1.0, -1.0); elm_genlist_multi_select_set(c_play_list, 1); elm_box_pack_end(vbox, c_play_list); evas_object_show(c_play_list); //genlist class defs itc_c_play_list.item_style = "default"; itc_c_play_list.func.text_get = c_play_gl_text_get; itc_c_play_list.func.content_get = c_play_gl_content_get; itc_c_play_list.func.state_get = c_play_gl_state_get; itc_c_play_list.func.del = c_play_gl_del; // add button hbox hbox1 = elm_box_add(playlist_page_win); elm_box_horizontal_set(hbox1, 1); elm_box_homogeneous_set(hbox1, 1); evas_object_size_hint_weight_set(hbox1, 1.0, 0.0); evas_object_size_hint_align_set(hbox1, -1.0, 0.0); elm_box_pack_end(vbox, hbox1); evas_object_show(hbox1); //add add dir button to hbox add_alb_button = elm_button_add(playlist_page_win); elm_object_text_set(add_alb_button, "Add Album"); evas_object_size_hint_weight_set(add_alb_button, 1.0, 1.0); evas_object_size_hint_align_set(add_alb_button, -1.0, -1.0); elm_box_pack_end(hbox1, add_alb_button); evas_object_show(add_alb_button); evas_object_smart_callback_add(add_alb_button, "clicked", create_add_alb_page, NULL); //add remove song button to hbox remove_songs_button = elm_button_add(playlist_page_win); elm_object_text_set(remove_songs_button, "Del Songs"); evas_object_size_hint_weight_set(remove_songs_button, 1.0, 1.0); evas_object_size_hint_align_set(remove_songs_button, -1.0, -1.0); elm_box_pack_end(hbox1, remove_songs_button); evas_object_show(remove_songs_button); evas_object_smart_callback_add(remove_songs_button, "clicked", remove_songs_button_clicked, c_play_list); //add cancel button to hbox1 cancel_button = elm_button_add(playlist_page_win); elm_object_text_set(cancel_button, "Cancel"); evas_object_size_hint_weight_set(cancel_button, 1.0, 1.0); evas_object_size_hint_align_set(cancel_button, -1.0, -1.0); elm_box_pack_end(hbox1, cancel_button); evas_object_show(cancel_button); wl.win = playlist_page_win; wl.li = c_play_list; evas_object_smart_callback_add(cancel_button, "clicked", cancel_button_clicked, &wl); //set delete callback for this window evas_object_smart_callback_add(playlist_page_win, "delete,request", cancel_button_clicked, &wl); if (strcmp(pl_name, "") == 0) { elm_entry_entry_set(entry, "myplaylist"); } else { elm_entry_entry_set(entry, pl_name); //populate the list with songs from the playlist populate_playlist_songs (c_play_list); } evas_object_resize(playlist_page_win, 480, 600); evas_object_show(playlist_page_win); } void create_set_page(void *data, Evas_Object *obj, void *event_info) { set_page_win = elm_win_add(NULL, "set", ELM_WIN_BASIC); elm_win_title_set(set_page_win, "Settings"); elm_win_autodel_set(set_page_win, 1); Evas_Object *bg, *vbox, *hbox, *cancel_button, *fr, *box, *priority_slider; Evas_Object *bass_slider, *treble_slider, *vbox1, *rdg, *rdg_bt; static Winlist wl; //add background bg = elm_bg_add(set_page_win); elm_win_resize_object_add(set_page_win, bg); evas_object_size_hint_weight_set(bg, 1.0, 1.0); evas_object_show(bg); //add vbox vbox = elm_box_add(set_page_win); elm_win_resize_object_add(set_page_win, vbox); evas_object_size_hint_weight_set(vbox, 1.0, 1.0); evas_object_size_hint_align_set(vbox, -1.0, -1.0); evas_object_show(vbox); // add hbox hbox = elm_box_add(set_page_win); elm_box_horizontal_set(hbox, 1); evas_object_size_hint_weight_set(hbox, 1.0, 0.0); evas_object_size_hint_align_set(hbox, -1.0, -1.0); elm_box_pack_end(vbox, hbox); evas_object_show(hbox); //add bass slider bass_slider = elm_slider_add(set_page_win); elm_object_scale_set(bass_slider, 1.0); elm_object_text_set(bass_slider, "Bass"); elm_slider_horizontal_set(bass_slider, 0); elm_slider_inverted_set(bass_slider, 1); elm_slider_span_size_set(bass_slider, 180); elm_slider_unit_format_set(bass_slider, "%2.0f"); elm_slider_indicator_format_set(bass_slider, "%2.0f"); evas_object_size_hint_weight_set(bass_slider, 1.0, 1.0); evas_object_size_hint_align_set(bass_slider, -1.0, -1.0); elm_box_pack_end(hbox, bass_slider); elm_slider_min_max_set(bass_slider, 0, 15); elm_slider_value_set(bass_slider, (double)bass); evas_object_show(bass_slider); evas_object_smart_callback_add(bass_slider, "delay,changed", bass_changed, NULL); //add treble slider treble_slider = elm_slider_add(set_page_win); elm_object_scale_set(treble_slider, 1.0); elm_object_text_set(treble_slider, "Treble"); elm_slider_horizontal_set(treble_slider, 0); elm_slider_inverted_set(treble_slider, 1); elm_slider_span_size_set(treble_slider, 180); elm_slider_unit_format_set(treble_slider, "%2.0f"); elm_slider_indicator_format_set(treble_slider, "%2.0f"); evas_object_size_hint_weight_set(treble_slider, 1.0, 1.0); evas_object_size_hint_align_set(treble_slider, -1.0, -1.0); elm_box_pack_end(hbox, treble_slider); elm_slider_min_max_set(treble_slider, 0, 15); elm_slider_value_set(treble_slider, (double)treble); evas_object_show(treble_slider); evas_object_smart_callback_add(treble_slider, "delay,changed", treble_changed, NULL); //add a slider for mplayer priority priority_slider = elm_slider_add(set_page_win); elm_object_scale_set(priority_slider, 1.0); elm_object_text_set(priority_slider, "Prioirty"); elm_slider_horizontal_set(priority_slider, 0); elm_slider_span_size_set(priority_slider, 180); elm_slider_unit_format_set(priority_slider, "%2.0f"); elm_slider_indicator_format_set(priority_slider, "%2.0f"); evas_object_size_hint_weight_set(priority_slider, 1.0, 1.0); evas_object_size_hint_align_set(priority_slider, -1.0, -1.0); elm_box_pack_end(hbox, priority_slider); elm_slider_min_max_set(priority_slider, -20, 0); elm_slider_value_set(priority_slider, (double)priority); evas_object_show(priority_slider); evas_object_smart_callback_add(priority_slider, "delay,changed", priority_changed, NULL); //add vbox1 to hbox vbox1 = elm_box_add(set_page_win); evas_object_size_hint_weight_set(vbox1, 1.0, 1.0); evas_object_size_hint_align_set(vbox1, -1.0, -1.0); elm_box_pack_end(hbox, vbox1); evas_object_show(vbox1); //add a frame fr = elm_frame_add(set_page_win); elm_object_scale_set(fr, 1.0); elm_object_style_set(fr, "default"); elm_object_text_set(fr, "Playlist Data"); evas_object_size_hint_weight_set(fr, 1.0, 0.0); evas_object_size_hint_align_set(fr, -1.0, -1.0); elm_box_pack_end(vbox1, fr); evas_object_show(fr); //add a box box = elm_box_add(set_page_win); evas_object_size_hint_weight_set(box, 1.0, 0.0); evas_object_size_hint_align_set(box, -1.0, 0.0); elm_object_content_set(fr, box); evas_object_show(box); //add radio buttons rd = elm_radio_add(set_page_win); elm_radio_state_value_set(rd, pl_info); evas_object_size_hint_weight_set(rd, 1.0, 1.0); evas_object_size_hint_align_set(rd, -1.0, 0.5); elm_object_text_set(rd, "Show Song Tag"); elm_box_pack_end(box, rd); evas_object_show(rd); rdg = rd; evas_object_smart_callback_add(rd, "changed", playlist_song_tg, NULL); rd = elm_radio_add(set_page_win); if (pl_info) elm_radio_state_value_set(rd, 0); else elm_radio_state_value_set(rd, 1); evas_object_size_hint_weight_set(rd, 1.0, 1.0); evas_object_size_hint_align_set(rd, -1.0, 0.5); elm_radio_group_add(rd, rdg); elm_object_text_set(rd, "Show File Name"); elm_box_pack_end(box, rd); evas_object_show(rd); evas_object_smart_callback_add(rd, "changed", playlist_song_tg, NULL); //add a frame fr = elm_frame_add(set_page_win); elm_object_scale_set(fr, 1.0); elm_object_style_set(fr, "default"); elm_object_text_set(fr, "UI Size (Restart)"); evas_object_size_hint_weight_set(fr, 1.0, 0.0); evas_object_size_hint_align_set(fr, -1.0, -1.0); elm_box_pack_end(vbox1, fr); evas_object_show(fr); //add a box box = elm_box_add(set_page_win); evas_object_size_hint_weight_set(box, 1.0, 0.0); evas_object_size_hint_align_set(box, -1.0, 0.0); elm_object_content_set(fr, box); evas_object_show(box); //add radio buttons rd = elm_radio_add(set_page_win); elm_radio_state_value_set(rd, finger); evas_object_size_hint_weight_set(rd, 1.0, 1.0); evas_object_size_hint_align_set(rd, -1.0, 0.5); elm_object_text_set(rd, "Large"); elm_box_pack_end(box, rd); evas_object_show(rd); rdg = rd; evas_object_smart_callback_add(rd, "changed", finger_tg, NULL); rd = elm_radio_add(set_page_win); if (finger) elm_radio_state_value_set(rd, 0); else elm_radio_state_value_set(rd, 1); evas_object_size_hint_weight_set(rd, 1.0, 1.0); evas_object_size_hint_align_set(rd, -1.0, 0.5); elm_radio_group_add(rd, rdg); elm_object_text_set(rd, "Small"); elm_box_pack_end(box, rd); evas_object_show(rd); evas_object_smart_callback_add(rd, "changed", finger_tg, NULL); //add a frame fr = elm_frame_add(set_page_win); elm_object_scale_set(fr, 1.0); elm_object_style_set(fr, "default"); elm_object_text_set(fr, "mplayer Output"); evas_object_size_hint_weight_set(fr, 1.0, 0.0); evas_object_size_hint_align_set(fr, -1.0, -1.0); elm_box_pack_end(vbox1, fr); evas_object_show(fr); //add a box box = elm_box_add(set_page_win); evas_object_size_hint_weight_set(box, 1.0, 0.0); evas_object_size_hint_align_set(box, -1.0, 0.0); elm_object_content_set(fr, box); evas_object_show(box); //add radio buttons rd_bt = elm_radio_add(set_page_win); if (bt) elm_radio_state_value_set(rd_bt, 1); else elm_radio_state_value_set(rd_bt, 0); evas_object_size_hint_weight_set(rd_bt, 1.0, 1.0); evas_object_size_hint_align_set(rd_bt, -1.0, 0.5); elm_object_text_set(rd_bt, "Phone Speaker"); elm_box_pack_end(box, rd_bt); evas_object_show(rd_bt); rdg_bt = rd_bt; evas_object_smart_callback_add(rd_bt, "changed", bt_tg, NULL); rd_bt = elm_radio_add(set_page_win); if (bt) elm_radio_state_value_set(rd_bt, 0); else elm_radio_state_value_set(rd_bt, 1); evas_object_size_hint_weight_set(rd_bt, 1.0, 1.0); evas_object_size_hint_align_set(rd_bt, -1.0, 0.5); elm_radio_group_add(rd_bt, rdg_bt); elm_object_text_set(rd_bt, "BT Headphones"); elm_box_pack_end(box, rd_bt); evas_object_show(rd_bt); evas_object_smart_callback_add(rd_bt, "changed", bt_tg, NULL); //add a frame /*fr = elm_frame_add(set_page_win); elm_object_scale_set(fr, 1.0); elm_object_style_set(fr, "default"); elm_object_text_set(fr, "mplayer Priority"); evas_object_size_hint_weight_set(fr, 0.0, 0.0); evas_object_size_hint_align_set(fr, 0.0, -1.0); elm_box_pack_end(vbox1, fr); evas_object_show(fr);*/ //add cancel button to vbox cancel_button = elm_button_add(set_page_win); elm_object_text_set(cancel_button, "Done"); evas_object_size_hint_weight_set(cancel_button, 1.0, 1.0); evas_object_size_hint_align_set(cancel_button, -1.0, -1.0); elm_box_pack_end(vbox, cancel_button); evas_object_show(cancel_button); wl.win = set_page_win; wl.li = NULL; evas_object_smart_callback_add(cancel_button, "clicked", cancel_button_clicked, &wl); evas_object_resize(set_page_win, 480, 600); evas_object_show(set_page_win); } intone-0.77+git20120308/src/gui.h000066400000000000000000000143211172615526600161020ustar00rootroot00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) chaitanya chandel 2009 * * gui.h is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * gui.h is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "db_sqlite.h" #include #define ALBUM 0 #define PLAYLIST 1 #define SMALL 0 #define LARGE 1 void create_gui(Evas_Object *win); void create_add_page(Evas_Object *add_page); void create_playing_page(Evas_Object *playing_page); void create_playlist_page(void *data, Evas_Object *obj, void *event_info); void create_art_page(void *data, Evas_Object *obj, void *event_info); void create_dir_browser_page(void *data, Evas_Object *obj, void *event_info); void prev_button_clicked(void *data, Evas_Object *obj, void *event_info); void play_button_clicked(void *data, Evas_Object *obj, void *event_info); void next_button_clicked(void *data, Evas_Object *obj, void *event_info); void add_dir_button_clicked(void *data, Evas_Object *obj, void *event_info); void vol_changed(void *data, Evas_Object *obj, void *event_info); void pos_changed_start(void *data, Evas_Object *obj, void *event_info); void pos_changed(void *data, Evas_Object *obj, void *event_info); void load_playlist(Evas_Object *li, const char *p_list); void up_button_clicked(void *data, Evas_Object *obj, void *event_info); void home_button_clicked(void *data, Evas_Object *obj, void *event_info); void dir_list_select(void *data, Evas_Object *obj, void *event_info); void list_dir(char *direc);//, int depth); void load_dir(Evas_Object *li, char *direc); void create_manage_playlist_page(); void add_songs_button_clicked(void *data, Evas_Object *obj, void *event_info); void rem_songs_button_clicked(void *data, Evas_Object *obj, void *event_info); void del_playlist_button_clicked(void *data, Evas_Object *obj, void *event_info); void create_eq_page (void *data, Evas_Object *obj, void *event_info); void popup_message(char *message, char *msg, int butt_state); void popup_alert(char *message); int cancel_alert(void *data, Evas_Object *obj, void *event_info); int ack_alert(void *data, Evas_Object *obj, void *event_info); void cancel_button_clicked(void *data, Evas_Object *obj, void *event_info); void song_select(void *data, Evas_Object *obj, void *event_info); int set_duration(void); void show_song_info (void); void remove_song_button_clicked(void *data, Evas_Object *obj, void *event_info); void save_playlist_button_clicked(void *data, Evas_Object *obj, void *event_info); int check_audio_files(char *path); void create_set_page(void *data, Evas_Object *obj, void *event_info); void toggle_view (void *data, Evas_Object *obj, void *event_info); void randomize_list(void); void manage_songs_page(void *data, Evas_Object *obj, void *event_info); void sel_songs_by_page(void *data, Evas_Object *obj, void *event_info); void random_tg(void *data, Evas_Object *obj, void *event_info); void loop_tg(void *data, Evas_Object *obj, void *event_info); void bt_tg(void *data, Evas_Object *obj, void *event_info); void show_song_lyrics(void); void change_view_list(void); extern int check_file_exists(char *path); extern void sel_song (void); extern void populate_filter_list(char *type, Evas_Object *list); extern void set_song_info(void); extern void start_mplayer_bt(void); extern void start_mplayer(void); extern void key_press(void *data, Evas *canvas_in, Evas_Object *obj, void *event_info); extern void song_select_play(void *data, Evas_Object *obj, void *event_info); extern void bass_changed(void *data, Evas_Object *obj, void *event_info); extern void treble_changed(void *data, Evas_Object *obj, void *event_info); extern void priority_changed(void *data, Evas_Object *obj, void *event_info); extern void finger_tg(void *data, Evas_Object *obj, void *event_info); extern void rescan_button_clicked(void *data, Evas_Object *obj, void *event_info); extern Eina_Bool update_scan_popup(void *); extern void song_scan(void); extern void temp_playlist(void *data, Evas_Object *obj, void *event_info); extern void edit_playlist_button_clicked(void *data, Evas_Object *obj, void *event_info); extern void sel_playlist_button_clicked(void *data, Evas_Object *obj, void *event_info); extern void add_album_button_clicked(void *data, Evas_Object *obj, void *event_info); extern void remove_songs_button_clicked(void *data, Evas_Object *obj, void *event_info); extern void populate_home_list(Evas_Object *li); extern void remove_dir_button_clicked(void *data, Evas_Object *obj, void *event_info); extern void playlist_song_tg(void *data, Evas_Object *obj, void *event_info); extern void set_random_mode(void *data, Evas_Object *obj, void *event_info); Evas_Object *list, *album_list, *pos_slider, *c_play_list, *play_list, *song_lb, *artist_lb, *popup_lb, *add_album_list; Evas_Object *lyrics_sc, *lyrics_entry, *ic_playlist, *ic_albums, *add_page_win, *manage_playlist_page_win, *im; Evas_Object *dir_browser_page_win, *vbox, *win, *list_box, *play_button, *ic_shuffle, *ic_repeat, *ic_play, *ic_bt, *ic_view; Evas_Object *select_songs_page_win, *sel_songs_win, *manage_songs_page_win, *play_dur, *play_cur_pos, *rd, *rd_bt; Evas_Object *set_page_win, *songs_dir_lb, *popup_bt, *home_list, *shuffle_hv; extern int song_index, fd, no_songs, play_state, seek, song_dur, loop, finger, *seq, bt, next_song_random; extern int bass, treble, priority, pid; extern Elm_Object_Item *old_song; extern FILE *mp_data; extern pthread_t thread_id; extern Ecore_Timer *scan_timer; int view, songs_scanned, albums_scanned, depth, scanning; extern char home_dir[255], cur_artist[254], cur_song[254], songs_dir[254]; Elm_Genlist_Item_Class itc_list, itc_dir_list, itc_album_list, itc_c_play_list, itc_play_list, itc_add_album_list, itc_filter_list; Elm_Genlist_Item_Class itc_filter_final, itc_home_list; intone-0.77+git20120308/src/main.c000066400000000000000000000116211172615526600162350ustar00rootroot00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) chaitanya chandel 2009 * * main.c is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * main.c is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #define _GNU_SOURCE #include #include #include #include #include #include "dbus-stuff.h" #include "gui.h" //globals //dynamic Arrays: song_list, pl_data, path_songs - based on no_songs in a playlist int fd, no_songs = 0, song_index = 0, vol = 80, sys_vol = 0, treble=0, bass=0, priority=0, pid=0, version=0; int pos_time = 0, seek = 0, song_dur = 0, loop = 0, finger = 0, randomize= 0, *seq, bt = 0, pl_info=0; int play_state = IDLE, PHONE = 0, next_song_random = 0; char cur_playlist[254], (*path_songs)[254]=NULL, cur_song[254], cur_artist[254], songs_dir[254], order_by[254]; Elm_Object_Item *song_list[10000], *old_song; Ecore_Timer *timer1 = NULL, *scan_timer = NULL; pthread_t thread_id, t_id; FILE *mp_data; _dir dir_gl_entry[254]; _dir *pl_data; _str2 name_path[254]; static void my_win_del(void *data, Evas_Object *obj, void *event_info) { int ret; ssize_t read = 0; size_t len = 0; char *ans = ""; //free dynamic arrays free(path_songs); //free(song_list); free(pl_data); //tell mplayer to quit ret = write(fd, "quit 1\n", 7); while(strncmp(ans, "Exiting", 7) != 0) { read = getline(&ans, &len, mp_data); } save_state(); close(fd); fclose(mp_data); //unlink the fifo files unlink("/tmp/intone-mplayer"); unlink("/tmp/mplayer-intone"); sqlite3_close(songs); if (bt)bluetooth_off(); release_cpu (); //restore alsa state ret = system("alsactl -f /usr/share/shr/scenarii/stereoout.state restore"); elm_exit(); } void start_mplayer(void) { int ret; char tmpstr[PATH_MAX]; sprintf(tmpstr, "mplayer -idle -quiet -slave -msglevel global=6 -input file=/tmp/intone-mplayer 1>/tmp/mplayer-intone"); ret = system(tmpstr); } void start_mplayer_bt(void) { int ret; char tmpstr[PATH_MAX]; sprintf(tmpstr, "mplayer -ao alsa:device=bluetooth -idle -quiet -slave -msglevel global=6 -input file=/tmp/intone-mplayer 1>/tmp/mplayer-intone 2>&1"); ret = system(tmpstr); } void dbus_stuff(void) { //prevent suspend occupy_cpu(); //set up listener for incoming calls incoming_call_listener(); } EAPI int elm_main(int argc, char **argv) { int ret; char buf[255], line[10], *ans; FILE *fp; //struct stat sts; //check for mplayer and exit if not present //if(stat("/usr/bin/mplayer", &sts) == -1 && ENOENT) { //printf ("Please install mplayer"); //exit(1); //} //restore state //printf("restoring state\n"); restore_state(); //adjust finger size if(finger == SMALL) elm_config_finger_size_set(60); //load snd-pcm-oss ret = system("modprobe snd-pcm-oss"); //TODO : auto rescan the media directory on changes //printf("creating window\n"); //set up win win = elm_win_add(NULL, "main", ELM_WIN_BASIC); if (strcmp(cur_playlist, "ty_playlist") == 0) strcpy(buf, "Selected Songs"); else if (strcmp(cur_playlist, "0 All Songs") == 0) strcpy(buf, "All Songs"); else strcpy(buf, cur_playlist); elm_win_title_set(win, buf); evas_object_smart_callback_add(win, "delete,request", my_win_del, NULL); //show the window create_gui(win); evas_object_show(win); //unlink the fifo files - symlink vulnerablility as pointed out by Paul Wise - Thanks!! unlink("/tmp/intone-mplayer"); unlink("/tmp/mplayer-intone"); //create a fifo file for sending commands to mplayer mkfifo("/tmp/intone-mplayer", S_IRUSR| S_IWUSR | O_NONBLOCK); //create a fifo file for reading mplayer output mkfifo("/tmp/mplayer-intone", S_IRUSR| S_IWUSR | O_NONBLOCK); //printf("starting mplayer\n"); //create mplayer thread if (!bt) ret = pthread_create(&thread_id, NULL, (void *)start_mplayer, NULL); else ret = pthread_create(&thread_id, NULL, (void *)start_mplayer_bt, NULL); //open fifo read only mp_data = fopen("/tmp/mplayer-intone", "r"); //open fifo write only fd = open("/tmp/intone-mplayer", O_WRONLY, 0666); //get the pid value of mplayer fp = popen("pidof mplayer", "r"); ans = fgets(line, sizeof line, fp); pclose(fp); pid = atoi(line); //renice mplayer sprintf(buf, "renice %d %d\n", priority, pid); ret = system(buf); //printf("init dbus\n"); //start the dbus thread ret = pthread_create(&t_id, NULL, (void *)dbus_stuff, NULL); elm_run(); ecore_main_loop_quit(); elm_shutdown(); return 0; } ELM_MAIN()