:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Forums Hébergés :: > OldSchool Library > Aide au développement

Aide au développement Aide sur l'utilisation d'OSLib

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 20/12/2007, 12h46   #1
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut durée d'un son

salut,

comment faire pour connaitre la durée d'un son (en millisecondes) après l'avoir chargé?
est ce qu'il existe un moyen? genre une fonction oslGetSoundDuration(OSL_SOUND *).
__________________
Essayez mon dernier jeu sur iPhone:

daaa57150 est déconnecté   Réponse avec citation

Publicité

Vieux 20/12/2007, 16h37   #2
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 226
Par défaut

Non il n'y a pas moyen. Ca ne fait pas partie du modèle de driver son par défaut d'OSLib (ce serait compliqué de gérer ça pour tous les formats existants), donc c'est impossible. Désolé
Brunni est déconnecté   Réponse avec citation
Vieux 20/12/2007, 16h49   #3
Bobby Sixkilla
Maître Chinpoko-extra-mon
 
Date d'inscription: 10/11/2005
Localisation: Palaiseau (Rive sud)
Messages: 6 465
Voir les codes amis Nintendo DS
Par défaut

Comment font les softs de lecture de musique pour afficher cette donnée?
__________________
"Un pour l'argent, deux pour le spectacle et trois pour le cailloux" un putain d'énergumène
Bobby Sixkilla est déconnecté   Réponse avec citation
Vieux 20/12/2007, 21h15   #4
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut

dommage
je vais voir si j'arrive à le calculer au moins pour les wav, si c'est faisable en php (exemple) ca doit être faisable en C/C++.

est ce que les fichiers bgm possèdent un header ou est ce que c'est purement des données? parce que s'il n'y a pas de header on peut forcément calculer la durée en se basant sur la taille du fichier et le bitrate (s'il est constant bien sûr).


Citation:
Envoyé par Bobby Sixkilla Voir le message
Comment font les softs de lecture de musique pour afficher cette donnée?
ils ont surement des fonctions différentes pour chaque type de fichier son, pour soit les lire dans le header soit les calculer par un moyen quelconque. évidamment ca représente un travail assez énorme et fastidieux...
__________________
Essayez mon dernier jeu sur iPhone:


Dernière modification par daaa57150 ; 20/12/2007 à 21h19.
daaa57150 est déconnecté   Réponse avec citation
Vieux 20/12/2007, 21h49   #5
Bobby Sixkilla
Maître Chinpoko-extra-mon
 
Date d'inscription: 10/11/2005
Localisation: Palaiseau (Rive sud)
Messages: 6 465
Voir les codes amis Nintendo DS
Par défaut

Tu ne pourrais pas récupérer ce code en trouvant un soft open source qui le fait?
__________________
"Un pour l'argent, deux pour le spectacle et trois pour le cailloux" un putain d'énergumène
Bobby Sixkilla est déconnecté   Réponse avec citation
Vieux 07/01/2008, 13h00   #6
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut

voilà ce que j'ai réussi à faire pour des wav:

Code PHP:
long int utils::wavDuration(string wavfile//en ms
{
    
char riff[5];
    
char wave[5];
    
char fmt[5];
    
char data[5];
    
    
unsigned long int length=0binary=0stereo=0bits=0sample=0bps=0bpsam=0bitsps=0sound=0;
    
int s=0;
    
    
FILE *wav=fopen(wavfile.c_str(),"rb+");
    if(
wav==NULL)
    {
        
oslFatalError(("cannot open file "+wavfile).c_str());
    }
    
    
/* To start the RIFF Chunk must be determined*/
    
fread(riff,1,4,wav);
    
riff[4]='\0';
    
string str_riff=string(riff);
    if(
str_riff.find("RIFF")!=0)
    {
        
fclose(wav);
        
oslFatalError("error in header not wav file");
    }
    
    
fread(&length,4,1,wav);
    
    
fread(wave,1,4,wav);
    
wave[4]='\0';
    
string str_wave=string(wave);
    if(
str_wave.find("WAVE")!=0)
    {
        
fclose(wav);
        
oslFatalError("error not in WAV format");
    }
    
    
/* Secondly the FORMAT Chunk must be determined*/
    
fread(fmt,1,4,wav);
    
fmt[4]='\0';
    
string str_fmt=string(fmt);
    if(
str_fmt.find("fmt")!=0)
    {
        
fclose(wav);
        
oslFatalError("error, no fmt chunk");
    }
    
    
//TODO: fseek 16
    
fread(&binary,4,1,wav);    
    
fread(&bits,2,1,wav);
    
fread (&stereo,2,1,wav);        
    
fread(&sample,4,1,wav);
    
fread(&bps,4,1,wav);
    
    
    
fread(&bpsam,2,1,wav);
    if (
bpsam==0x01)
    {
        
//this is 8 bit mono
        
s=1;
    }
    else if (
bpsam==0X02)
    {
        
//this is 8 bit stereo or 16 bit mono
        
s=2;
    }        
    else if (
bpsam==0X04)
    {
        
//this is 16 bit stereo
        
s=4;    
    }
    else
    {
        
oslFatalError("impossible to determine bpsam of file");
    }
    
    
fread(&bitsps,2,1,wav);
    
    
/* Thirdly the DATA Chunk must be determined*/
    //must find it
    
bool found=false;
    
char c[1]={'0'};
    
long int ft=ftell(wav);
    while(!
found)
    {
        
fread(c,1,1,wav);
        
ft++;
        
        if(
c[0]=='d')
        {
            
fread(data,1,3,wav);
            
data[3]='\0';
            
string str_data=string(data);
            if (
str_data.find("ata")==0)
            {
                
found=true;
            }
            else
            {
                
fseek(wavftSEEK_SET);
            }
        }
    }
    
    
fread(&sound,4,1,wav);
    
    
fclose(wav);
    
    
/* Convert the length of the file into milliseconds */
    
float result=(float(sound)/float(s*sample))*1000.0f;
    
    return (
long int)(result);

ca a fonctionné pour 3 sons que j'ai testés (44kHz 16bits mono, 22kHz 16bits stereo, 44kHz 16bits stereo) mais a priori ca devrait fonctionner avec tous les fichiers wav...

j'ai trouvé ca sur je sais plus quel site et j'ai dû modifier des trucs notamment la partie "data", c'est pour ca qu'il y a des trucs inutiles mais bon ca peut servir à d'autres.

Brunni tu as une doc ou des liens sur le format bgm que tu utilises dans l'oslib?
__________________
Essayez mon dernier jeu sur iPhone:


Dernière modification par daaa57150 ; 07/01/2008 à 16h15. Motif: modifs car plantage sur fichiers longs (int trop petit)
daaa57150 est déconnecté   Réponse avec citation
Vieux 07/01/2008, 16h17   #7
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut

pour les bgm ceci a l'air de fonctionner:

Code PHP:
long int utils::bgmDuration(string bgmfile//en ms
{
    
OSL_SOUND *snd=oslLoadSoundFileBGM(bgmfile.c_str(), OSL_FMT_STREAM);
    
    
long int bytes_total=snd->size;
    
long int bytes_header=sizeof(BGM_FORMAT_HEADER);
    
long int bytes_data=bytes_total-bytes_header;
        
    
oslDeleteSound(snd);
    
    
float divider=22050.0f;
    
float result=(float(bytes_data)/divider)*1000.0f;
            
    return (
long int)(result);

testé aussi sur 3 sons de différentes durées (3, 6 et 127 sec) et ca fonctionne.

PS: double post pour lisibilité.
__________________
Essayez mon dernier jeu sur iPhone:


Dernière modification par daaa57150 ; 07/01/2008 à 16h20.
daaa57150 est déconnecté   Réponse avec citation
Vieux 07/01/2008, 18h56   #8
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 226
Par défaut

Cool Merci de nous avoir fait partager ton travail
Brunni est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h15.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince