Need your feedback

hi everyone
i have created this small game for toddlers as part of class
assignment. It is meant for young children to explore different
sounds.
http://www.baylinks.net/rudi/lobster.html
please take your time to have a look at it and give me your
feedback and any suggestion for improvement.
thanks

Something that I'd recommend...
As you're sitting at a piano, the farther you go to the
right, the higher pitch the key is going to be, and the farther you
go to the left the lower the pitch is going to but you have it
switched.

Similar Messages

  • BB in Home sub forums? Need your feedback in Idea...

    Hi Guys
    Not sure if you have had a chance to check out the Ideas Bank yet?  An idea has been submitted suggesting that the BB in Home board should be split into smaller sub forums?  What do you think?  Is this a good idea?  What sub-forums should we have?
    Please check out this idea and give it a rating if you like it.  You can also add comments to the suggestion if you want to give further feedback.
    Rememebr you can also be entered in our prize draw to win £50 if you submit an idea yourself on or before 3rd February....
    Information and FAQs on using the Ideas Bank
    Thx
    Kerry
    Retired BTCare Community Manager - StephanieG and SeanD are your new Community Managers
    If you like a post, or want to say thanks for a helpful answer, please click on the Ratings star on the left-hand side of the post.
    If someone answers your question correctly please let other members know by clicking on ’Mark as Accepted Solution’.

    Thanks tim1964
    Can you add your comment in the Ideas Bank?  you can link directly to the suggestion by clicking here.  Once in there, you can click the ratings star to show your support of the idea.
    Cheers
    Kerry
    Retired BTCare Community Manager - StephanieG and SeanD are your new Community Managers
    If you like a post, or want to say thanks for a helpful answer, please click on the Ratings star on the left-hand side of the post.
    If someone answers your question correctly please let other members know by clicking on ’Mark as Accepted Solution’.

  • NEED YOUR FEEDBACK: How do you work?

    On my "Dive into BC4J" weblog, I posted a question that I'm interested in getting email feedback to feed into our planning for 9.0.5 Production.
    http://radio.weblogs.com/0118231/2003/07/23.html#a119
    We're trying to solicit as many end-user opinions as we can because it's an interesting area of the product. We're trying to simplify more incremental development of web applications. In light of that, what is the role of wizards like our current "Complete Application Wizards".
    Please have a read and email me your comments at [email protected] We value your input.
    Thanks.

    Forgotten RESTRICTIONS Passcode
    - Place the iOS device in Recovery Mode and restore via iTunes. For how to restore: iTunes: Restoring iOS software
    You have to either:
    - Restore from a backup that was make before you added the Restrictions passcode. If you restore from a backup made with the Restrictions passcode the Restrictions passcode is also restored.
    - Restore to factory settings/new iPod

  • Tagged Needs your Feedback!

    Hey Folks, 
    We are considering a potential NEW Feature for the site and would love your feedback

    Hello, Tagged Guys! Kindly keep the old profile format. The new format is picture-heavy straight away. The old format layout balances profile photo on the left and text of user details on the right, so it is better. With the old profile format, reading user details first is better than looking at all the photos. The new format seems to encourage people to be more shallow, that is, to base their judgment of friends on physical appearances first than what's on their mind. Thanks!

  • Need your feedback!!! Who is using a filter?

    I'd like to know who all is using a filter with their Creator built applicaiton.
    In specific, I'd like to know if you are using getPathTranslated() as mentioned in this post: http://swforum.sun.com/jive/thread.jspa?forumID=123&threadID=50520
    If you are, would you please reply to this thread and tell me what app server or web server you are using (Tomcat, JBoss, Sun's, etc).
    THANKS!

    So no one out there uses a filter?
    How do you all verify user's as having been logged in then? Do you add code to each page to check the session?

  • I request your feedback on my Swing application - juwo

    Hello,
    Would you like to test drive an innovative prototype called juwo/NP?
    You can give me feedback and help me improve it. You can play a part in bringing out something that IMHO is a useful everyday tool.
    To those who help others on this forum, I can send you the demos, and competitive analysis matrix - if you are interested. However, you would have to give me your word that (sorry, I dont know how to put it diplomatically) you will not rip off any new ideas nor forward the links. Also I want to avoid sending demos to competitors so please tell me if you work for one.
    Several of you have helped me through my Swing obstacles in developing juwo/NP by answering my queries - philip74, JayDS, camickr, hiwa and others. Thank you.
    Unfortunately, progress has slowed.
    (see http://juwo-works.blogspot.com/2007/03/i-need-your-advice-startup-failing.html). So I have decided to release it anyway. Basic functionality is complete. However some people say it is not user friendly. Also mouseClicked() fails on JDK 1.6.
    What is juwo? (http://juwo.com)
    A "Swiss Army knife" piece of software that gives more power to consumers to structure audio, video and text as a bullet list, to more easily index and annotate them, and to share the lists with others. Its benefits extend to multimedia as related to more enriching broadcasts, collaboration and organizing.
    thanks,
    Anil Philip
    anil AT juwo DOT com
    Olathe, KS

    an innovative prototype
    competitive analysis matrix
    gives more power to consumersSounds like you're still trying to market it. I think that you can't really interest people (and create a good viral "word of mouth") by keeping everything so closed. I understand that you are afraid of being ripped off by the competition, but if you're always one step ahead of them, it doesn't matter that they copy your old features, as long as you're constantly producing new ones.
    I'm looking at the screenshot on the site and what exactly am i seeing? Pixels and lines? It doesn't really make me want to download and try it out. And these days, if one look doesn't stop the casual browsing user, than he's gone.
    What i'm trying to say is - don't be afraid to put fully functioning demo on your site and all the best screenshots (in the original resolution) that you have.

  • Give us your feedback on v1.2 of the ILM Assistant

    Please give us your feedback on v1.2
    What would you like us to do next?
    Lilian

    Lillian,
    I had sent you information back on 02/29/2008 as a reply to this thread but it must have got deleted.
    Here is the thread from that day.
    I finally got this to work in my 11g database with Database Vault.
    I got to the ILM login page when I exchanged p=4550:10:2805095104274743
    for p=737677:10:2805095104274743.
    i.e.
    http://oraprod-dr.lodgian.com:8080/apex/f?p=737677:10:2805095104274743
    The documentation for logging into ILM 1.2 seems to be not quite accurate.
    What I saw on that page were 2 boxes:
    1. Database User
    2. Password
    So you actually need to login with a "database" user account.
    Initially I logged in as "SYS" just to see what would happen.
    Then I was able to see the ILM tabs and menus.
    I then went into OEM and created a new database user "ILM_DB_ADMIN".
    I followed the instructions for executing the grant_privs.sql script to that newly created database account.
    I was then able to login with that database account.
    Now the url http://oraprod-dr.lodgian.com:8080/apex/f?p=737677 immediately refers to the ILM login page.
    I would not think that this is a "backdoor" login method into ILM since the documentation does mention that you must use a "database" account.
    Regards,
    Bruce Hawkins

  • Appreciate your feedback: Usability - A good UI is revitalizing

    Dear experts,
    I would appreciate your feedback and rating for the blog http://scn.sap.com/community/best-built-applications/blog/2012/03/21/usability--a-good-ui-is-revitalizing#
    Thanks in advance,
    Regards,
    Leon

    Hi,
    There are some mistakes in your procedure
    1) you are passing the object verison number to the api from the per_all_people_f which should not be the case. you need to pass from the per_all_assignments_f object version number as your updating assignment screen not people screen.
    2) Use the Date track mode as Update , so that old superviosr data or any record will be end dated and new record will be created.
    3) In exception it is always advisable to write dbms_output.put_line(SQLERRM). so that it will give u the exact error if any occurs during execution of program.
    there is no table with per_assignments_x , use the table per_all_assignments_f which is a date track table for assignments
    see the below eg : pass the parametres where ever required. which will help you writing your procedure.
    declare
    l_assignment_id number:=> pass the assignment id of the employee;
    l_obj_version_number number:=>fetch and pass the object version number of the assignment
    begin
    hr_assignment_api.update_gb_emp_asg
    (p_validate => false
    ,p_effective_date => pass the date from which u want to update the assignment
    ,p_datetrack_update_mode => 'Update'
    ,p_assignment_id => l_assignment_id
    ,p_object_version_number => l_obj_version_number
    ,p_supervisor_id => pass the supervisor_id
    ,p_cagr_grade_def_id => l_cagr_grade_def_id
    ,p_cagr_concatenated_segments => l_cagr_concatenated_segments
    ,p_concatenated_segments => l_concatenated_segments
    ,p_soft_coding_keyflex_id => l_soft_coding_keyflex_id
    ,p_comment_id => l_comment_id
    ,p_effective_start_date => l_effective_start_date
    ,p_effective_end_date => l_effective_end_date
    ,p_no_managers_warning => l_no_managers_warning
    ,p_other_manager_warning => l_other_manager_warning
    ,p_hourly_salaried_warning => l_hourly_salaried_warning
    commit;
    exception when others then
    dbms_output.put_line(SQLERRM);
    end;
    Hope it helps
    Cheers

  • Can I use The Airport Express as a router only. Need your help

    Hi there,
    I need to get some help from anyone for a good wireless router for a MacBook Pro. I want to know if anyone had a Airport Express as a router only of some help in this matter.
    Hope to get your feedback. Thanks
    From Samantha Kellar

    Can you explain a bit more?
    The Apple Express is a router. The new Apple Express has a LAN port so you can have a device on a wired connection.
    Are you talking about removing the modem and only having the Airport Express?

  • NEED YOUR PLEASE

    Dear Database Support Professional,
    I am Database Administrator and I am writing to ask for your help in responding to a 10-12 minute survey for a degree requirement on relational database support professionals in the USA. Please note that the respondent is completely anonymous. If I don’t get this portion of my degree completed by the end of this semester, then I would have to wait for another year which entails additional costs and time on me. By completing the survey, you will be contributing to research in our field and also there is the satisfaction of having helped a fellow professional and a fellow human being attain his goals. I believe a good turn always bring another in some way in our lives. I therefore kindly beg for your help to a fellow database professional by completing this survey. The link to the survey is provided below. If possible please forward to other database professionals or groups:
    http://www.surveymonkey.com/s.aspx?sm=a1JqU7GVt1g6rCkIPyL23w_3d_3d
    Thank you earnestly for your kindness.
    Gabriel
    This survey is done solely for the purposed of a College degree requirement and is not associated with, nor represents the views, policy, or demands of any individuals, corporation, or any other named organization.
    Thank you in advance for your kind participation

    I have never felt compelled to say this to anyone here in these forums before but after apparently you need some help with this.
    First everyone here knows that you are not telling the truth. And I mean everyone. We are serious IT professionals with enough mental horsepower to add 1 and 1 and come up with 2. Here's how.
    You claim this is for a school project but we all know it is not. What we do is look at your previous posts ... like this:
    Recent Messages:      
         NEED YOUR PLEASE
    English » Database » Database - General, Nov 23, 2009
    Dear Database Support Professional, I am Database Administrator and I am writing to ask for your h...
         Re: I NEED YOUR HELP PLEASE
    English » Technology Network Community » Community Feedback and Suggestions (Do Not Post Product-Related Questions Here), Nov 23, 2009
    Thanks for your particiapation.
         Re: I NEED YOUR HELP PLEASE
    English » Fusion Middleware » Application Server » Oracle Application Server - General, Nov 23, 2009
    Correct? only US support specialists. Thanks
         Re: I NEED YOUR HELP PLEASE
    English » E-Business Suite » EBS General Discussion, Nov 23, 2009
    Disagree about your spamming theory. An academic survey for knowledge is miles apart from spam and ...
         Re: I NEED YOUR HELP PLEASE
    English » Database » Database - General, Nov 23, 2009
    I am trying to reach as many respondents as I can and not all visit the same forum.
         Search for all user messages      
    Recent Questions:
    I NEED YOUR HELP PLEASE      
    English » Technology Network Community » Community Feedback and Suggestions (Do Not Post Product-Related Questions Here), Nov 22, 2009
    Dear Database Support Professional, I am Database Administrator and I am writing to ask for your...
    I NEED YOUR HELP PLEASE      
    English » Fusion Middleware » Application Server » Oracle Application Server - General, Nov 22, 2009
    Dear Database Support Professional, I am Database Administrator and I am writing to ask for your...
    NEED YOUR PLEASE      
    English » Database » Database - General, Nov 23, 2009
    Dear Database Support Professional, I am Database Administrator and I am writing to ask for your...
    I NEED YOUR HELP PLEASE      
    English » Database » Database - General, Nov 22, 2009
    Dear Database Support Professional, I am Database Administrator and I am writing to ask for your...
    I NEED YOUR HELP PLEASE      
    English » Database » Installation, Nov 22, 2009
    Dear Database Support Professional, I am Database Administrator and I am writing to ask for your... Yep ... there it is ... day after day posting the same nonsense: The same spam.
    I have reported you to OTN management and hopefully the administrators will soon remove your account and ask Oracle legal to go after you for violation of the Terms of Service you agreed to when you signed up for your OTN account.
    Consider doing the honorable thing. That would be an apology and a promise not to ever do this again. One thing you can be sure of ... we are not watching for you and your posts and will flag each and every one as spam if it is not on topic.

  • File Bloat - Give me your feedback

    Hey guys, I submitted a wish form as follows:
    Brief title for your desired feature:
    Cut the fat feature
    How would you like the feature to work?
    Captivate files tend to suffer from bloat, and when they start to get to big the only solution is to copy and paste all your slides into a new blank project. Unfortunately this breaks any links that you might have in your project. Some kind of tool that can go in an get rid of all unused internal resources that are bloating the file so you don't need to copy and paste.
    Why is this feature important to you?
    It will stop the many many questions in the Captivate forum on how to fix the problem, and we won't have to fix all our links every time we need to cut and paste.
    And I got a reply the very next day:
    Hi Kerry,
    I am from the Adobe Captivate Development team.
    Can you give the following info to help us look into the problem:
    1. Is the bloated project upgraded from Captivate 3 (or is it a new project created in Captivate 4) ? Have you ever faced the project bloating issue in Captivat4-only project (not the ones upgraded) ?
    2. Did you try removing un-used items from the library ?
    3. Will it be possible for you to share the project file (.cp)? - The bloated project file (which will give us a clear picture of the problem).
    regards,
    Sony
    So... give me your feedback in answer to the questions above and I'll consolidate it into a reponse to the development team.
    If you've ever been upset by file bloat... lay it on me and see if we can get it fixed (does it still do it in Cap 4?)
    Cheers and beers,
    Kerry

    Kerry,
    File bloat has been a recurring issue for Forum members (since RoboDemo?).  I have to say I don't have a problem because I design the training so each Captivate project rarely has more than 30 finished slides, and I clean out unused library items often.
    In the past, a solution has been to save the file as a different name then close and reopen (vs. copying and pasting and losing links).  Another strategy has been to publish often.  That seems to clear bloat in some cases.
    It's clear that Captivate is a processor hog, and as we clamor for more features, THAT probably won't go away.  Maybe we could benefit from a 'designing for (or around?) Captivate' Forum division?  Most of the training I see (and the underlying Captivate metaphor?) assumes we all create tidy one-file projects.  I think real-world projects are much larger and messier.  Hence the bloat.  --Leslie
    P.S.  Apologies for all the parentheses.  (Sometimes I can't resist an aside here and there.)

  • Adobe wants your feedback on Acrobat: Take a Quick Survey

    We are conducting two brief surveys to learn more about how customers get information on using Adobe Acrobat. We'd like your feedback. Additionally, please extend this invitation to anyone you know who uses Adobe Acrobat. Freely blog, email, or tweet the invitation to your contacts.
    Please click a link below to take a brief survey on one (or both) of the following topics:
    ·         Create and edit a PDF Portfolio
    ·         Create and distribute a PDF form, and export form data
    JoAnn Davis
    Community Help Administrator for Adobe Acrobat

    Have never needed to number 1, tried number 2 years ago without much success. No that no longer hold position (retired) I needed it for it no longer applies.
    Bigest problem Acrobat Macintosh has is creating a PDF since The adobe Pdf Printer Driver no longer works. And the work around doesn't work more than it does.

  • Need your help in Remodeling concept

    Hi Gurus need your help in time estimations
    I have a cube with data and now I need to add 10 new info objects to the cube which are including Date fields (BUDAT, BLDAT) these 10 fields will be populated to the cube from a Z table in ECC as we donu2019t have these fields in the cube we have to go for remodeling of the cube
    My client requires how much time it will take to complete this
    Now I want to know how much time it would take to do this (if any customer exits and user exits are required) and addition if new fields will have any effect on the current queries
    Please advice in this
    Thank you

    The time taken will depends on a lots of factor like server speed, available memory, background jobs etc. Apart from this, the time will also depends on how much the cube is filled i.e. the no. of records in the cube. Its very abstract to tell you the exact time taken for this. But, please make sure that you have the backup of the cube which you are going to re-model. T0 say, I think 3-4 hours should be ok for the remodelling.
    Thanks.
    Shambhu

  • 7.0 and your feedback on the new chat UI

    Totaly agree that it would also be nice to be able to hide the useless "Home" and "Call phones" buttons on the contact list.It can be a part of a "compact list" mode or as a separate option. I never use them. 

    Hi Skype Community,
    Since releasing the new chat experience on desktops to users on Windows and Mac we've looked closely into the feedback you've shared with us. Since September we've released multiple updates to Skype for Windows and Skype for Mac to incorporate smaller changes based on your feedback.
    Today we are making Skype 7.0 for Windows desktop available for download from Skype.com.
    New in 7.0.0.100:
    Compact sidebar: Some of you asked us to see more contacts and conversation in the left hand sidebar. Enable the option "Compact Sidebar View" from the "View" menu for a more compact layout.
    Compact Chat View: If you can live without your chat message having some whitespace around them to give them room to breathe you can now increase your "message per inch" ratio drastically by activating "Compact Chat view" in Skype Options - "IM & SMS" - Advanced settings. Also don't miss out on the other available tweaks to the UI we wrote about earlier.
    Toggle for large emoticons: Some users prefer not to show emoticons sent in an individual messages in a larger size. You can find an option to toggle this in the Skype Options - "IM & SMS" - "IM appearance"
    Toggle for unread messages: You can now quickly switch between your conversations that contain unread messages and all by using the dropdown on top right of your "Recent" list. See the screenshot on the right
    Touch scrolling: If you are sporting a device with a touch screen like a tablet you can now use vertical finger swipes to scroll in conversations. Better have a screen wipe at hand all the time though
    Disabling chat formatting: Especially role players using Skype have shared that they'd prefer the new text formatting options introduced in 6.22 to not apply to their IMs. This formatting is based on the use of wrapping parts of the message in characters like *, _ or ~. You can disable this permanently for all of your chats, by sending the following chat command to any of your chats:
    /setupkey *Lib/Conversation/EnableWiki 0
    To enable the formatting again please use this command:
    /setupkey *Lib/Conversation/EnableWiki 1
    This setting doesn't seem to stick reliably in 7.0 over restarts of the app. Skype is looking into this.
    Please give the new 7.0 version a spin and customize Skype layout and design closer to your liking. We are looking forward for your feedback.

  • Need your help on performance issue please

    Hello everyone!
    I need your help to understand an effect I notice with a Thread class I built. I currently work on enhancement of my application Playlist Editor (see http://www.lightdev.com/page74.htm) and a new release will be available soon.
    Among other extensions the new release will have a title filter function which is based on audio data that is recursively read from ID3 tags of files found in a given root directory. The data collection is done by a CollectionThread class which reads into a data model class AudioDataModel and the entire process works fine, no problem with that.
    However, when my application is started for the first time the CollectionThread runs approximately 3 minutes to collect data from approximately 4300 audio files on an Intel Pentium M 1,4 GHz, 512 MB RAM, Windows XP SP2. When the application is shut down and started again, it takes only a few seconds to do the same task for all subsequent launches.
    I already tried to start the application with java option -Xms40m to increase initial heap size. This increases performance in general but the effect is still the same, i.e. first run lasts significantly longer than subsequent runs.
    I also tried to build a pool mechanism which creates many empty objects in the data model and then releases them to contain the actual data at is being read in but this did not lead to better performance.
    It must have to do with how Java (or Windows?) allocates and caches memory. I wonder whether there is a way to pre-allocate memory or if there are any other ideas to improve performance so that the process always only takes seconds instead of minutes?
    I attach the key classes to this message. Any help or ideas is much appreciated!
    Thanks a lot a best regards
    Ulrich
    PS: You can use the news subscription service at
    http://www.lightdev.com/dynTemplate.php4?id=80&dynPage=subscribe.php4 to be informed when the new release of Playlist Editor is available.
    All classes posted here do not need debugging, they already have proven to run error free. The classes are only posted for information for the interested reader - no need to go through all the stuff in detail - only if it interests you.
    My application calls class CollectionThread wich is a subclass of InfoThread. CollectionThread recursively goes through a directory and file structure and stores found ID3 tag information in instances of class ID3v11Tag which in turn gets stored in one instance of class AudioDataModel. All classes are shown below.
    This is the mentioned CollectionThread
    * Light Development Playlist Editor
    * Copyright (C) 2004 Ulrich Hilger
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * as published by the Free Software Foundation; either version 2
    * of the License, or (at your option) any later version.
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    package com.lightdev.app.playlisteditor.data;
    import com.lightdev.lib.util.InfoThread;
    import java.io.File;
    * A class to collect audio data from a given storage location.
    * <p>
    * <code>CollectionThread</code> uses ID3 tag information to gain data.
    * </p>
    * <p>See <a href="http://www.id3.org">http://www.id3.org</a> for details about
    * ID3 tags.</p>
    * @author Ulrich Hilger
    * @author Light Development
    * @author <a href="http://www.lightdev.com">http://www.lightdev.com</a>
    * @author <a href="mailto:[email protected]">[email protected]</a>
    * @author published under the terms and conditions of the
    *      GNU General Public License,
    *      for details see file gpl.txt in the distribution
    *      package of this software as well as any licensing notes
    *      inside this documentation
    * @version 1, October 13, 2004
    public class CollectionThread extends InfoThread {
       * constructor
       * @param model  AudioDataModel  the data model to collect data to
      public CollectionThread(AudioDataModel model) {
        this.model = model;
       * constructor, creates a new empty AudioDataModel
      public CollectionThread() {
        this(new AudioDataModel());
       * set the data model to collect data to
       * @param model AudioDataModel  the model to collect data to
      public void setModel(AudioDataModel model) {
        this.model = model;
       * get the data model associated to this thread
       * @return AudioDataModel  the data model
      public AudioDataModel getModel() {
        return model;
       * set the directory to collect data from
       * @param rootDir File  the directory to collect data from
      public void setRootDirectory(File rootDir) {
        this.rootDir = rootDir;
       * do te actual work of this thread, i.e. iterate through a given directory
       * structure and collect audio data
       * @return boolean  true, if work is left
      protected boolean work() {
        boolean workIsLeft = true;
        maxValue = -1;
        filesProcessed = 0;
        if(getStatus() < STATUS_HALT_PENDING) {
          countElements(rootDir.listFiles());
        if(getStatus() < STATUS_HALT_PENDING) {
          workIsLeft = collect(rootDir.listFiles());
        return workIsLeft;
       * count the elements in a given file array including its subdirectories
       * @param files File[]
      private void countElements(File[] files) {
        int i = 0;
        while (i < files.length && getStatus() < STATUS_HALT_PENDING) {
          File file = files;
    if (file.isDirectory()) {
    countElements(file.listFiles());
    i++;
    maxValue++;
    * recursively read data into model
    * @param files File[] the file array representing the content of a given directory
    private boolean collect(File[] files) {
    int i = 0;
    while(i < files.length && getStatus() < STATUS_HALT_PENDING) {
    File file = files[i];
    if(file.isDirectory()) {
    collect(file.listFiles());
    else if(file.getName().toLowerCase().endsWith("mp3")) {
    try {
    model.addTrack(file);
    catch(Exception e) {
    fireThreadException(e);
    i++;
    filesProcessed++;
    fireThreadProgress(filesProcessed);
    return (i<files.length);
    /** the directory to collect data from */
    private File rootDir;
    /** the data model to collect data to */
    private AudioDataModel model;
    /** the number of files this thread processed so far while it is running */
    private long filesProcessed = 0;
    This is class InfoThread
    * Light Development Java Library
    * Copyright (C) 2003, 2004 Ulrich Hilger
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * as published by the Free Software Foundation; either version 2
    * of the License, or (at your option) any later version.
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    package com.lightdev.lib.util;
    import java.util.Vector;
    import java.util.Enumeration;
    * Abstract class <code>InfoThread</class> implements a status and listener concept.
    * An <code>InfoThread</code> object actively informs all objects registered as listeners about
    * status changes, progress and possible exceptions. This way the status of a running
    * thread does not require a polling mechanism to be monitored.
    * <p>
    * <code>InfoThread</code> implements the following working scheme
    * </p>
    * @author Ulrich Hilger
    * @author Light Development
    * @author <a href="http://www.lightdev.com">http://www.lightdev.com</a>
    * @author <a href="mailto:[email protected]">[email protected]</a>
    * @author published under the terms and conditions of the
    *      GNU General Public License,
    *      for details see file gpl.txt in the distribution
    *      package of this software
    * @version Version 1, October 13, 2004
    public abstract class InfoThread extends Thread {
       * construct an <code>InfoThread</code> object
       * <p>This class is meant to be used when a <code>Thread</code> object is needed that actively
       * informs other objects about its status</code>. It is a good idea therefore to register
       * one or more listeners with instances of this class before doing anything
       * else.</p>
       * @see addInfoThreadListener
      public InfoThread() {
       * set the amount of time this thread shall idle after it is through with one
       * work cycle and before a next work cycle is started. This influences the time
       * other threads have for their work.
       * @param millis long  the number of milliseconds to idle after one work cycle
      public void setIdleMillis(long millis) {
        idleMillis = millis;
       * Causes this thread to begin execution; the Java Virtual Machine calls the <code>run</code>
       * method of this thread. Calls method <code>prepareThread</code> before calling
       * <code>run</code>.
       * @see run
       * @see prepareThread
      public synchronized void start() {
        setStatus(STATUS_INITIALIZING);
        prepareThread();
        setStatus(STATUS_READY);
        super.start();
       * call method <code>start</code> instead of this method.
       * calling this method directly will lead to an exception
       * @see start
      public void run() {
        //System.out.println("InfoThread.run");
        if (status == STATUS_READY) {
          boolean workIsLeft = true;
          setStatus(STATUS_RUNNING);
          while (status < STATUS_STOP_PENDING && workIsLeft) {
            if (status < STATUS_HALT_PENDING) {
              workIsLeft = work();
              if(!workIsLeft) {
                setStatus(STATUS_WORK_COMPLETE);
            if (status == STATUS_HALT_PENDING) {
              setStatus(STATUS_HALTED);
            else if (status == STATUS_STOP_PENDING) {
              setStatus(STATUS_STOPPED);
            else {
              try {
                sleep(idleMillis);
              catch (InterruptedException e) {
                fireThreadException(e);
        else {
          // error: Thread is not ready to run
        setStatus(STATUS_THREAD_FINISHED);
       * stop this thread. This will terminate the thread irrevokably. Use method
       * <code>haltThread</code> to pause a thread with the possiblity to resume work later.
       * @see haltThread
      public void stopThread() {
        switch (status) {
          case STATUS_RUNNING:
            setStatus(STATUS_STOP_PENDING);
            break;
          case STATUS_HALT_PENDING:
            // exception: the thread already is about to halt
            break;
          case STATUS_STOP_PENDING:
            // exception: the thread already is about to stop
            break;
          default:
            // exception: a thread can not be stopped, when it is not running
            break;
       * halt this thread, i.e. pause working allowing to resume later
       * @see resumeThread
      public void haltThread() {
        switch (status) {
          case STATUS_RUNNING:
            setStatus(STATUS_STOP_PENDING);
            break;
          case STATUS_HALT_PENDING:
            // exception: the thread already is about to halt
            break;
          case STATUS_STOP_PENDING:
            // exception: the thread already is about to stop
            break;
          default:
            // exception: a thread can not be halted, when it is not running
            break;
       * resume this thread, i.e. resume previously halted work
       * @see haltThread
      public void resumeThread() {
        if(status == STATUS_HALTED || status == STATUS_HALT_PENDING) {
          setStatus(STATUS_RUNNING);
        else {
          // exception: only halted threads or threads that are about to halt can be resumed
       * this is the method to prepare a thread to run. It is not implemented in this abstract
       * class. Subclasses of <code>InfoThread</code> can implement this method to do anything
       * that might be required to put their thread into STATUS_READY. This method is called
       * automatically by method <code>start</code>.  When implementing this method, it should
       * call method <code>fireThreadException</code> accordingly.
       * @see start
       * @see fireThreadException
      protected void prepareThread() {
        // does nothing in this abstract class but might be needed in subclasses
       * this is the main activity method of this object. It is not implemented in this abstract
       * class. Subclasses of <code>InfoThread</code> must implement this method to do something
       * meaningful. When implementing this method, it should call methods
       * <code>fireThreadProgress</code> and <code>fireThreadException</code> accordingly.
       * @return boolean true, if work is left, false if not
       * @see fireThreadProgress
       * @see fireTreadException
      protected abstract boolean work();
       * add an <code>InfoTreadListener</code> to this instance of <code>InfoThread</code>
       * @param l InfoThreadListener  the listener to add
       * @see removeInfoThreadListener
      public void addInfoThreadListener(InfoThreadListener l) {
        listeners.add(l);
       * remove an <code>InfoTreadListener</code> from this instance of <code>InfoThread</code>
       * @param l InfoThreadListener  the listener to remove
      public void removeInfoThreadListener(InfoThreadListener l) {
        listeners.remove(l);
       * notify all <code>InfoThreadListener</code>s of a status change
       * @param fromStatus int  the status tis thread had before the change
       * @param toStatus int  the status this thread has now
      protected void fireThreadStatusChanged(int fromStatus, int toStatus) {
        Enumeration e = listeners.elements();
        while(e.hasMoreElements()) {
          Object l = e.nextElement();
          if(l instanceof InfoThreadListener) {
            ((InfoThreadListener) l).threadStatusChanged(this, fromStatus, toStatus);
       * notify all <code>InfoThreadListener</code>s of an exception in this thread
       * @param ex Exception  the exception that occurred
      protected void fireThreadException(Exception ex) {
        Enumeration e = listeners.elements();
        while(e.hasMoreElements()) {
          Object l = e.nextElement();
          if(l instanceof InfoThreadListener) {
            ((InfoThreadListener) l).threadException(this, ex);
       * notify all <code>InfoThreadListener</code>s of the progress of this thread
       * @param progressValue long  a value indicating the current thread progress
      protected void fireThreadProgress(long progressValue) {
        Enumeration e = listeners.elements();
        while(e.hasMoreElements()) {
          Object l = e.nextElement();
          if(l instanceof InfoThreadListener) {
            ((InfoThreadListener) l).threadProgress(this, progressValue, maxValue);
       * set the status of this thread and notify all listeners
       * @param newStatus int  the status this thread is to be changed to
      private void setStatus(int newStatus) {
        //System.out.println("InfoThread.setStatus oldStatus=" + status + ", newStatus=" + newStatus);
        int fromStatus = status;
        status = newStatus;
        fireThreadStatusChanged(fromStatus, newStatus);
       * get the current status of this thread
       * @return int  the status
      public int getStatus() {
        return status;
       * cleanup before actual destruction.
      public void destroy() {
        //System.out.println("InfoThread.destroy");
        cleanup();
        super.destroy();
       * cleanup all references this thread maintains
      private void cleanup() {
        //System.out.println("InfoThread.cleanup");
        listeners.removeAllElements();
        listeners = null;
      /* ----------------------- class fields start ------------------------ */
      /** storage for the objects this thread notifies about status changes and progress */
      private Vector listeners = new Vector();
      /** indicator for the status of this thread */
      private int status = STATUS_NONE;
      /** maximum value for threadProgress */
      protected long maxValue = -1;
      /** the idle time inside one work cycle in milliseconds */
      protected long idleMillis = 1;
      /* ----------------------- class fields end -------------------------- */
      /* ----------------------- constants start --------------------------- */
      /** constant value indicating that no status has been set so far */
      public static final int STATUS_NONE = 0;
      /** constant value indicating that the thread is currently initializing */
      public static final int STATUS_INITIALIZING = 1;
      /** constant value indicating that the thread is ready to run */
      public static final int STATUS_READY = 2;
      /** constant value indicating that the thread is running */
      public static final int STATUS_RUNNING = 3;
      /** constant value indicating that the thread is about to halt */
      public static final int STATUS_HALT_PENDING = 4;
      /** constant value indicating that the thread is halted */
      public static final int STATUS_HALTED = 5;
      /** constant value indicating that the work of this thread is complete */
      public static final int STATUS_WORK_COMPLETE = 6;
      /** constant value indicating that the thread is about to stop */
      public static final int STATUS_STOP_PENDING = 7;
      /** constant value indicating that the thread is stopped */
      public static final int STATUS_STOPPED = 8;
      /** constant value indicating that the thread is finished */
      public static final int STATUS_THREAD_FINISHED = 9;
      /* ----------------------- constants end --------------------------- */
    }this is the InfoThreadListener interface
    * Light Development Java Library
    * Copyright (C) 2003, 2004 Ulrich Hilger
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * as published by the Free Software Foundation; either version 2
    * of the License, or (at your option) any later version.
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    package com.lightdev.lib.util;
    * An interface classes interested to receive events from objects
    * of class <code>InfoThread</code> need to implement.
    * @author Ulrich Hilger
    * @author Light Development
    * @author <a href="http://www.lightdev.com">http://www.lightdev.com</a>
    * @author <a href="mailto:[email protected]">[email protected]</a>
    * @author published under the terms and conditions of the
    *      GNU General Public License,
    *      for details see file gpl.txt in the distribution
    *      package of this software
    * @version Version 1, October 13, 2004
    public interface InfoThreadListener {
       * method to receive a status change notification from a thread
       * @param thread InfoThread  the thread which status changed
       * @param fromStatus int  the status which the thread had before the change
       * @param toStatus int  the status which the thread has now
      public void threadStatusChanged(InfoThread thread, int fromStatus, int toStatus);
       * method to receive a notification about the progress of a thread
       * @param thread InfoThread  the thread which notified about its progress
       * @param progressValue long  the value (e.g. 10 if 100 percent completed, 20 of 1 million files processed, etc.)
      public void threadProgress(InfoThread thread, long progressValue, long maxValue);
       * method to receive a notifiaction about the fact that an exception occurred in a thread
       * @param thread InfoThread  the thread for which an exception occurred
       * @param e Exception  the exception that occurred
      public void threadException(InfoThread thread, Exception e);
    }This is class AudioFileDescriptor
    * Light Development Java Library
    * Copyright (C) 2004 Ulrich Hilger
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * as published by the Free Software Foundation; either version 2
    * of the License, or (at your option) any later version.
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    package com.lightdev.lib.audio;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.io.Serializable;
    import java.text.DecimalFormat;
    * This class models characteristics of an audio file such as the absolute path
    * of the file, its tag contents (if any) and the play duration, etc.
    * <p>See <a href="http://www.id3.org">http://www.id3.org</a> for details about
    * ID3 tags.</p>
    * @author Ulrich Hilger
    * @author Light Development
    * @author <a href="http://www.lightdev.com">http://www.lightdev.com</a>
    * @author <a href="mailto:[email protected]">[email protected]</a>
    * @author published under the terms and conditions of the
    *      GNU General Public License,
    *      for details see file gpl.txt in the distribution
    *      package of this software
    * @version Version 1, October 13, 2004
    public class AudioFileDescriptor implements Serializable, Comparable {
      public AudioFileDescriptor(String absolutePath) throws FileNotFoundException, IOException {
        load(absolutePath);
      public boolean equals(Object o) {
        if(o != null && o instanceof AudioFileDescriptor) {
          return ((AudioFileDescriptor) o).getAbsolutePath().equalsIgnoreCase(this.getAbsolutePath());
        else {
          return false;
      public void load(String absolutePath) throws FileNotFoundException, IOException {
        this.absolutePath = absolutePath;
        RandomAccessFile rf = new RandomAccessFile(absolutePath, "r");
        if(id3v11Tag == null) {
          id3v11Tag = new ID3v11Tag(rf, false);
        else {
          id3v11Tag.readTag(rf, rf.length() - 128);
        rf.close();
      public String getAbsolutePath() {
        return absolutePath;
      public ID3v11Tag getID3v11Tag() {
        return id3v11Tag;
      public void setID3v11Tag(ID3v11Tag tag) {
        this.id3v11Tag = tag;
      public String toString() {
        DecimalFormat df = new DecimalFormat("00");
        return id3v11Tag.getArtist() + ", " + id3v11Tag.getAlbum() + " - " +
            df.format(id3v11Tag.getTrackNumber()) + " " + id3v11Tag.getTitle();
       * Compares this object with the specified object for order.
       * @param o the Object to be compared.
       * @return a negative integer, zero, or a positive integer as this object is less than, equal to,
       *   or greater than the specified object.
       * @todo Implement this java.lang.Comparable method
      public int compareTo(Object o) {
        return toString().compareTo(o.toString());
      private String absolutePath;
      private ID3v11Tag id3v11Tag;
      private transient long duration = -1;
      private transient int type = TYPE_UNKNOWN;
      public static final transient int TYPE_UNKNOWN = 0;
      public static final transient int TYPE_MP3 = 1;
    }This is class ID3V11Tag into which the data is actually stored
    * Light Development Java Library
    * Copyright (C) 2004 Ulrich Hilger
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * as published by the Free Software Foundation; either version 2
    * of the License, or (at your option) any later version.
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    package com.lightdev.lib.audio;
    import java.io.File;
    import java.io.RandomAccessFile;
    import java.io.IOException;
    import java.io.Serializable;
    import java.text.DecimalFormat;
    * This class is a very simple implementation of an ID3v11Tag. It models an ID3 tag
    * pretty much the same way as it is physically stored inside an audio file.
    * <p>See <a href="http://www.id3.org">http://www.id3.org</a> for details about
    * ID3 tags.</p>
    * @author Ulrich Hilger
    * @author Light Development
    * @author <a href="http://www.lightdev.com">http://www.lightdev.com</a>
    * @author <a href="mailto:[email protected]">[email protected]</a>
    * @author published under the terms and conditions of the
    *      GNU General Public License,
    *      for details see file gpl.txt in the distribution
    *      package of this software
    * @version Version 1, October 13, 2004
    public class ID3v11Tag implements Serializable, Comparable {
       * construct an ID3v11Tag and read tag content from a given file
       * <p>This constructor can be used for cases where a RandomAccessFile has already
       * been opened and will be closed elsewhere</p>
       * @param rf RandomAccessFile  the open file to read from
       * @param isAtTagStartPos boolean  true, if the file pointer is at the
       * position where the ID3 tag starts; when false, the pointer is positioned accordingly here
       * @throws IOException
      public ID3v11Tag(RandomAccessFile rf, boolean isAtTagStartPos) throws IOException {
        if(isAtTagStartPos) {
          readTag(rf);
        else {
          readTag(rf, rf.length() - 128);
       * construct an ID3v11Tag and read tag content from a file at a given location
       * <p>This constructor opens and closes the audio file for reading</p>
       * @param absolutePath String  the absolute path to the audio file to open
       * @throws IOException
      public ID3v11Tag(String absolutePath) throws IOException {
        RandomAccessFile rf = new RandomAccessFile(absolutePath, "r");
        readTag(rf, rf.length() - 128);
        rf.close();
       * construct an ID3v11Tag and read tag content from a given file
       * <p>This constructor opens and closes the audio file for reading</p>
       * @param audioFile File  the audio file to read from
       * @throws IOException
      public ID3v11Tag(File audioFile) throws IOException {
        this(audioFile.getAbsolutePath());
       * get a string representation of this object
       * @return String
      public String toString() {
        DecimalFormat df = new DecimalFormat("00");
        return getArtist() + ", " + getAlbum() + " - " + df.format(getTrackNumber()) + " " + getTitle();
       * position to file pointer and read the tag
       * @param rf RandomAccessFile  the file to read from
       * @param jumpPos long  the position to jump to (the tag start position)
       * @throws IOException
      public void readTag(RandomAccessFile rf, long jumpPos) throws IOException {
        rf.seek(jumpPos);
        readTag(rf);
       * read the tag from a given file, assuming the file pointer to be at the tag start position
       * @param rf RandomAccessFile  the file to read from
       * @throws IOException
      public void readTag(RandomAccessFile rf) throws IOException {
        rf.read(tagBuf);
        if(tag.equalsIgnoreCase(new String(tagBuf))) {
          rf.read(title);
          rf.read(artist);
          rf.read(album);
          rf.read(year);
          rf.read(comment);
          rf.read(trackNo);
          rf.read(genre);
      public String getTitle() {
        return new String(title).trim();
      public String getArtist() {
        return new String(artist).trim();
      public String getAlbum() {
        return new String(album).trim();
      public String getYear() {
        return new String(year).trim();
      public String getComment() {
        return new String(comment).trim();
      public int getGenreId() {
        try {
          int id = new Byte(genre[0]).intValue();
          if(id < GENRE_ID_MIN || id > GENRE_ID_MAX) {
            return GENRE_ID_OTHER;
          else {
            return id;
        catch(Exception ex) {
          return GENRE_ID_OTHER;
      public String getGenreName() {
        return genreNames[getGenreId()];
      public int getTrackNumber() {
        try {
          return (int) trackNo[0];
        catch(Exception e) {
          return 0;
       * Compares this object with the specified object for order.
       * @param o the Object to be compared.
       * @return a negative integer, zero, or a positive integer as this object is less than, equal to,
       *                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

    Hi Franck,
    thank you, mate. I did what you suggested (changed class attached) but that did not change the mentioned behaviour.
    The first run is approximately 75 seconds with Java option -Xms40m and approx. double without, the second run and all subsequent runs are only 2-3 seconds each (!!!) even when terminating and re-starting the application between thread runs.
    I'm pretty clueless about that, any more help on this anyone?
    Thanks a lot and best regards
    Ulrich
    PS: BTW, I forgot to post the class that is filled with data by class CollectionThread, so here it is
    * Light Development Playlist Editor
    * Copyright (C) 2004 Ulrich Hilger
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * as published by the Free Software Foundation; either version 2
    * of the License, or (at your option) any later version.
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    package com.lightdev.app.playlisteditor.data;
    import java.io.File;
    import com.lightdev.lib.audio.ID3v11Tag;
    import javax.sound.sampled.UnsupportedAudioFileException;
    import java.io.IOException;
    import java.io.Serializable;
    import com.lightdev.lib.audio.AudioFileDescriptor;
    import com.lightdev.lib.ui.SortListModel;
    import java.util.Iterator;
    * Storage model for audio data.
    * <p>
    * <code>AudioDataModel</code> can be used to store ID3 tag data collected from
    * a directory with audio files to perform queries and reports on the found data.
    * </p>
    * <p>See <a href="http://www.id3.org">http://www.id3.org</a> for details about
    * ID3 tags.</p>
    * @author Ulrich Hilger
    * @author Light Development
    * @author <a href="http://www.lightdev.com">http://www.lightdev.com</a>
    * @author <a href="mailto:[email protected]">[email protected]</a>
    * @author published under the terms and conditions of the
    *      GNU General Public License,
    *      for details see file gpl.txt in the distribution
    *      package of this software as well as any licensing notes
    *      inside this documentation
    * @version 1, October 15, 2004
    public class AudioDataModel extends SortListModel implements Serializable {
       * constructor
      public AudioDataModel() {
       * add an audio track from a given audio file
       * <p>This will attempt to read ID3 tag data from the file.</p>
       * @param audioFile File  the file to add audio data for
       * @throws IOException
      public void addTrack(File audioFile) throws IOException {
        AudioFileDescriptor afd = new AudioFileDescriptor(audioFile.getAbsolutePath());
        if (!data.contains(afd)) {
          data.add(afd);
       * get all tracks for agiven combination of genre name, artist name and album name. Any of
       * the parameters may be null or AudioDataModel.FILTER_ALL
       * <p>Ugly code, I know, but it simply hard codes all combinations of the the mentioned
       * parameters. Any more elegant implementations welcome.</p>
       * @param genreName String  a genre name to get tracks for
       * @param artistName String  an artist name to get tracks for
       * @param albumName String  an album name to get tracks for
       * @return SortListModel   the found tracks in a list model
      public SortListModel getTracks(String genreName, String artistName, String albumName) {
        SortListModel foundTracks = new SortListModel();
        Iterator e = data.iterator();
        while(e.hasNext()) {
          AudioFileDescriptor afd = (AudioFileDescriptor) e.next();
          ID3v11Tag tag = afd.getID3v11Tag();
          if(genreName == null || genreName.equalsIgnoreCase(FILTER_ALL)) {
            if(artistName == null || artistName.equalsIgnoreCase(FILTER_ALL)) {
              if (tag.getAlbum().equalsIgnoreCase(albumName))
                foundTracks.add(afd);
            else {
              if(albumName == null || albumName.equalsIgnoreCase(FILTER_ALL)) {
                if (tag.getArtist().equalsIgnoreCase(artistName))
                  foundTracks.add(afd);
              else {
                if (tag.getArtist().equalsIgnoreCase(artistName) &&
                    tag.getAlbum().equalsIgnoreCase(albumName))
                  foundTracks.add(afd);
          else {
            if(artistName == null || artistName.equalsIgnoreCase(FILTER_ALL)) {
              if(albumName == null || albumName.equalsIgnoreCase(FILTER_ALL)) {
                if (tag.getGenreName().equalsIgnoreCase(genreName))
                  foundTracks.add(afd);
              else {
                if (tag.getGenreName().equalsIgnoreCase(genreName) &&
                    tag.getAlbum().equalsIgnoreCase(albumName))
                  foundTracks.add(afd);
            else {
              if(albumName == null || albumName.equalsIgnoreCase(FILTER_ALL)) {
                if (tag.getGenreName().equalsIgnoreCase(genreName) &&
                    tag.getArtist().equalsIgnoreCase(artistName))
                  foundTracks.add(afd);
              else {
                if (tag.getGenreName().equalsIgnoreCase(genreName) &&
                    tag.getArtist().equalsIgnoreCase(artistName) &&
                    tag.getAlbum().equalsIgnoreCase(albumName))
                  foundTracks.add(afd);
        foundTracks.sort();
        return foundTracks;
       * list all artists in this model
       * @return SortListModel
      public SortListModel listArtists() {
        SortListModel artists = new SortListModel();
        artists.add(FILTER_ALL);
        Iterator e = data.iterator();
        while (e.hasNext()) {
          ID3v11Tag tag = ((AudioFileDescriptor) e.next()).getID3v11Tag();
          String artistName = tag.getArtist();
          if (artists.indexOf(artistName) < 0) {
            artists.add(artistName);
        artists.sort();
        return artists;
       * list all artists in this model having titles belonging to a given genre
       * @param genreName String  name of the genre artists are searched for
       * @return SortListModel
      public SortListModel listArtists(String genreName) {
        SortListModel artists = new SortListModel();
        artists.add(FILTER_ALL);
        Iterator e = data.iterator();
        while (e.hasNext()) {
          ID3v11Tag tag = ((AudioFileDescriptor) e.next()).getID3v11Tag();
          String artistName = tag.getArtist();
          String genre = tag.getGenreName();
          if (artists.indexOf(artistName) < 0 && genre.equalsIgnoreCase(genreName)) {
            artists.add(artistName);
        artists.sort();
        return artists;
       * list all genres in this model
       * @return SortListModel
      public SortListModel listGenres() {
        SortListModel genres = new SortListModel();
        genres.add(FILTER_ALL);
        Iterator e = data.iterator();
        while (e.hasNext()) {
          ID3v11Tag tag = ((AudioFileDescriptor) e.next()).getID3v11Tag();
          String genreName = tag.getGenreName();
          if (genres.indexOf(genreName) < 0) {
            genres.add(genreName);
        genres.sort();
        return genres;
       * list all albums in this model
       * @return SortListModel
      public SortListModel listAlbums() {
        SortListModel albums = new SortListModel();
        albums.add(FILTER_ALL);
        Iterator e = data.iterator();
        while (e.hasNext()) {
          ID3v11Tag tag = ((AudioFileDescriptor) e.next()).getID3v11Tag();
          String albumName = tag.getAlbum();
          if (albums.indexOf(albumName) < 0) {
            albums.add(albumName);
        albums.sort();
        return albums;
       * list all albums in this model having titles belonging to a given genre
       * @param genreName String  name of the genre albums are searched for
       * @return SortListModel
      public SortListModel listAlbums(String genreName) {
        SortListModel albums = new SortListModel();
        albums.add(FILTER_ALL);
        Iterator e = data.iterator();
        while (e.hasNext()) {
          ID3v11Tag tag = ((AudioFileDescriptor) e.next()).getID3v11Tag();
          String albumName = tag.getAlbum();
          String genre = tag.getGenreName();
          if (albums.indexOf(albumName) < 0 && genre.equalsIgnoreCase(genreName)) {
            albums.add(albumName);
        albums.sort();
        return albums;
       * list all albums in this model having titles belonging to a given genre and artist
       * @param genreName String  name of the genre albums are searched for
       * @param artistName String  name of the artist albums are searched for
       * @return SortListModel
      public SortListModel listAlbums(String genreName, String artistName) {
        SortListModel albums = new SortListModel();
        albums.add(FILTER_ALL);
        Iterator e = data.iterator();
        while (e.hasNext()) {
          ID3v11Tag tag = ((AudioFileDescriptor) e.next()).getID3v11Tag();
          String albumName = tag.getAlbum();
          String genre = tag.getGenreName();
          String artist = tag.getArtist();
          if(genreName == null || genreName.equalsIgnoreCase(FILTER_ALL)) {
            if (albums.indexOf(albumName) < 0 &&
                artist.equalsIgnoreCase(artistName))
              albums.add(albumName);
          else {
            if (albums.indexOf(albumName) < 0 &&
                genre.equalsIgnoreCase(genreName) &&
                artist.equalsIgnoreCase(artistName))
              albums.add(albumName);
        albums.sort();
        return albums;
       * get the number of audio tracks stored in this data model
       * @return int  the number of tracks
      public int getTrackCount() {
        return data.size();
      /** constant to select all items of a given part */
      public static final String FILTER_ALL = "    all";
    }...and here the changed CollectionThread now caching found File objects in a vector
    * Light Development Playlist Editor
    * Copyright (C) 2004 Ulrich Hilger
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * as published by the Free Software Foundation; either version 2
    * of the License, or (at your option) any later version.
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    package com.lightdev.app.playlisteditor.data;
    import com.lightdev.lib.util.InfoThread;
    import java.io.File;
    import java.util.Vector;
    import java.util.Enumeration;
    * A class to collect audio data from a given storage location.
    * <p>
    * <code>CollectionThread</code> uses ID3 tag information to gain data.
    * </p>
    * <p>See <a href="http://www.id3.org">http://www.id3.org</a> for details about
    * ID3 tags.</p>
    * @author Ulrich Hilger
    * @author Light Development
    * @author <a href="http://www.lightdev.com">http://www.lightdev.com</a>
    * @author <a href="mailto:[email protected]">[email protected]</a>
    * @author published under the terms and conditions of the
    *      GNU General Public License,
    *      for details see file gpl.txt in the distribution
    *      package of this software as well as any licensing notes
    *      inside this documentation
    * @version 1, October 13, 2004
    public class CollectionThread extends InfoThread {
       * constructor
       * @param model  AudioDataModel  the data model to collect data to
      public CollectionThread(AudioDataModel model) {
        this.model = model;
       * constructor, creates a new empty AudioDataModel
      public CollectionThread() {
        this(new AudioDataModel());
       * set the data model to collect data to
       * @param model AudioDataModel  the model to collect data to
      public void setModel(AudioDataModel model) {
        this.model = model;
       * get the data model associated to this thread
       * @return AudioDataModel  the data model
      public AudioDataModel getModel() {
        return model;
       * set the directory to collect data from
       * @param rootDir File  the directory to collect data from
      public void setRootDirectory(File rootDir) {
        this.rootDir = rootDir;
       * this is the method to prepare a thread to run.
      protected void prepareThread() {
        maxValue = -1;
        filesProcessed = 0;
        innerCount = 0;
        fileList = new Vector();
       * do the actual work of this thread, i.e. iterate through a given directory
       * structure and collect audio data
       * @return boolean  true, if work is left
      protected boolean work() {
        boolean workIsLeft = true;
        if(getStatus() < STATUS_HALT_PENDING) {
          countElements(rootDir.listFiles());
        if(getStatus() < STATUS_HALT_PENDING) {
          workIsLeft = collect(); //collect(rootDir.listFiles());
          fileList.clear();
          fileList = null;
        return workIsLeft;
       * count the elements in a given file array including its subdirectories
       * @param files File[]
      private void countElements(File[] files) {
        int i = 0;
        while (i < files.length && getStatus() < STATUS_HALT_PENDING) {
          File file = files;
    if (file.isDirectory()) {
    countElements(file.listFiles());
    else {
    fileList.add(file);
    i++;
    maxValue++;
    * read data into model
    * @param files File[] the file array representing the content of a given directory
    * @return boolean true, if work is left
    private boolean collect(/*File[] files*/) {
    Enumeration files = fileList.elements();
    while(files.hasMoreElements() && getStatus() < STATUS_HALT_PENDING) {
    File file = (File) files.nextElement();
    try {
    model.addTrack(file);
    catch(Exception e) {
    fireThreadException(e);
    filesProcessed++;
    if(++innerCount > 99) {
    innerCount = 0;
    fireThreadProgress(filesProcessed);
    return false;
    int i = 0;
    while(i < files.length && getStatus() < STATUS_HALT_PENDING) {
    File file = files[i];
    if(file.isDirectory()) {
    collect(file.listFiles());
    else if(file.getName().toLowerCase().endsWith("mp3")) {
    try {
    model.addTrack(file);
    catch(Exception e) {
    fireThreadException(e);
    i++;
    filesProcessed++;
    fireThreadProgress(filesProcessed);
    return (i<files.length);
    /** the directory to collect data from */
    private File rootDir;
    /** the data model to collect data to */
    private AudioDataModel model;
    /** the number of files this thread processed so far while it is running */
    private long filesProcessed = 0;
    /** a list to temporary store found files */
    private Vector fileList;
    /** counter to determine when to fire progress messages */
    private int innerCount = 0;

Maybe you are looking for

  • 2 gb Ram

    Want to max out my RAM to 2gb. Any suggestions. Thanks Art

  • THIS IS A REALLY IMPORTANT QUESTION

    Right so there's no charge if you use iPhone to iPhone / iMessage to iMessage, but I read something about it charging out of the country if you're using 4G. Does this still apply if I have 4G, but unlimited messaging? ;_; please answer. Thank you.

  • UCCX 8.0 with Oracle Packages

    Hi All, I'm implementing a UCCX 8.0 IVR application to be integrated with Oracle 11g database. I have a requirement to call some packages on the Oracle database to retrieve some values and integrate it with the IVR script. Is there a way to call Orac

  • IOS8 mail and notice problem

    I just updated to iOS8. How di I receive a message when someone read my mail?

  • Status for releasing project

    Hi, I have a project which is in created status.We are getting the Budget distribution from Investment Prgm as we are linking measure to project. T code IM52. I want to have a control without Budget Distribution to the project, Nobody is allowed to r