Bon.
J'ai exposé mon soucis dans les forums amigaworld.net & amigans.net au cas où :p
Je l'expose ici aussi :
Au vu de sa structure, l'AmiDARK Engine fonctionne par instructions (non bloquantes).
J'ai donc par exemple :
1. Fonction pour charger un objet audio : DELoadSound( File, ID )
2. Fonctions pour jouer, pauser, résumer, stopper un son : DEPlaySound( ID ), DEPauseSound( ID ), DEResumeSound( ID ), DEStopSound( ID )
3. Fonction pour supprimer le son : DEDeleteSound( ID )
Je peux charger donc un son et le supprimer en utilisant les datatypes et ce sans problèmes.
Le problème est pour la lecture du son (et l'écoute donc :p)
Voici les 2 fonctions, celle de chargement et celle de lecture :
[quote]
void DELoadSound( char *szFilename, int iID ){
// ULONG res;
// uint32 longueur ;
if ( iID > 0 ){
if ( iID < 257 ){
if ( DESoundExist( iID ) == 0 ){
if( DEFileExist( szFilename ) == TRUE ){
AESound[ iID ].ObjectPTR = IDataTypes->NewDTObject( (STRPTR)szFilename,
DTA_SourceType, DTST_FILE,
DTA_GroupID, GID_SOUND,
SDTA_Volume, 63,
// SDTA_SignalTask, (ULONG)IExec->FindTask(NULL),
// SDTA_SignalBitMask, END_SOUND_SIGNAL,
TAG_END );
if ( AESound[ iID ].ObjectPTR != NULL ){
AESound[ iID ].Exist = TRUE;
AESound[ iID ].Loop = FALSE;
AESound[ iID ].Playing = 0;
AESound[ iID ].FileName = LCreateString( 256 );
LCopyString( szFilename, AESound[ iID ].FileName );
AESound[ iID ].Audio3D = 0 ; // This sound IS NOT a 3D Audio sound.
}else{
printf( "DELoadSound Warning : Object not created\n" );
AESound[ iID ].Exist = FALSE;
}
}
}
}
}
}
void DEPlaySound( int iID ){
if ( DESoundExist( iID ) == 1 ){
if ( AESound[ iID ].Playing != 0 ){
DEStopSound( iID );
}
mydtt.MethodID = DTM_TRIGGER;
mydtt.dtt_GInfo = NULL;
mydtt.dtt_Function = STM_PLAY;
mydtt.dtt_Data = NULL;
AESound[ iID ].dores = IDataTypes->DoDTMethodA( AESound[ iID ].ObjectPTR, NULL, NULL, (Msg)&mydtt );
IExec->Wait( SIGBREAKF_CTRL_C );
AESound[ iID ].Playing = 1;
}
}
[/quote]
Tout se compile sans défaut.
ma librairie libAmiDARK.a se compile sans problèmes.
Maintenant le soucis est le suivant :
1. Si je supprime la ligne avec le IExec->Wait( SIGBREAKF_CTRL_C )
Aucun son ne fonctionne. le DEPlaySound ne restitue rien !
2. Si je ne supprime pas la ligne IExec->Wait( SIGBREAKF_CTRL_C )
Le son se joue bien à la demande de l'utilisateur (voir exemple qui suit).
Mais le problème reste bloqué (apparemment dans le Wait) indéfiniment (même CTRL+C ou un clic dans le gadget de fermeture de fenêtre ne fait rien du tout).
Programme bloqué. Ca ne plante pas l'Amiga cependant !!!
Voici le code source de l'exemple "AmiDARK Engine" utilisé pour tester les commandes/fonctions audio :
[quote]
#!include! "libamidark.h"
int InKey;
void DarkLoop( void ){
// Setup Display.
DESetDisplayMode( 640, 480, 32 );
DESyncOn();
DESyncRate( 60 );
// Load the 4 samples using DataTypes.
DELoadSound( "Medias/oceanwave.wav", 1 );
DELoadSound( "Medias/break.wav", 2 );
DELoadSound( "Medias/DREAM.WAV", 3 );
DELoadSound( "Medias/electricarc.wav", 4 );
DELoadImageEx( "Medias/AmiDARK_Engine_Logo v2.png", 1, 1 );
InKey = 0;
while( !DELoop() ){
DECls();
DESetCursor( 0, 0 );
DEPrint( "AmiDARK Engine now play Audio Sounds using DATATYPES" );
DEPrint( "Press default QUIT KEY to stop this demonstration example." );
DEPrint( " " );
DEPrint( "Press 1 to play OceanWave.wav" );
DEPrint( "Press 2 to play Break.wav" );
DEPrint( "Press 3 to play Dream.wav" );
DEPrint( "Press 4 to play ElectricArc.wav" );
// Keyboard key 1 to 4 start replay of a sound.
InKey = DEScancode(); InKey--;
if ( InKey > 0 ){
if ( InKey < 5 ){
DEPlaySound( InKey );
}
}
DEPasteImageEx( 1, DEBitmapWidth( 0 ) - ( DEImageWidth( 1 ) + 4 ), 4, 1 );
DESync();
}
// We delete sounds from memory.
for ( InKey = 0; InKey < 5; InKey++ ){
DEStopSound( InKey );
DEDeleteSound( InKey );
}
}
[/quote]
Comme l'on peut le voir, je charge 4 instruments.
Et lorsque l'on utilise une touche clavier de 1 à 4, un des instruments est joué.
Donc, si je lance mon application, et quitte ... elle se quitte comme il faut.
Mais si je lance l'application et demande à jouer un son, j'obtiens les résultats cités plus haut en 1 (pas d'audio) & 2 (audio mais application bloquée).
L'objectif est de n'avoir AUCUN Wait car le principe même de la librairie est de permettre de tout faire en fond.
Je sais qu'il doit exister une solution, pour preuve, lorsque je charge l'objet, si je mets en attributs SDTA_Continuous, TRUE, les 4 sons se jouent en simultané au lancement de l'application et ce sans blocage. Je peux même quitter l'application avant la fin de lecture des sons, mes DEDeleteSound arrêtent et suppriment les objets sons correctement, aucun plantage.
J'ai essayé d'utiliser SDTA_Continuous en tant que paramètre avec SetDTAttrs pour modifier le son lorsque l'on demande la lecture ... sans succès ...
Quelqu'un aurait-il une idée pour solutionner ceci ?
Je me demande comment le logiciel MultiView fait pour ne pas bloquer pdt la lecture d'un audio ...
Merci par avance.
@+