2010-10-31 3 views
2

Мне было интересно, что было бы лучшим способом реализовать генератор кода Морзе. То, как он будет работать, - это тип пользователя в слове или фразе, а затем NSString будет передан в мой метод в качестве аргумента для обработки. Способ, которым я хочу обработать, - это прокрутить каждый символ в строке, а затем воспроизвести правильную последовательность тонов, когда я иду. Я уже реализовал механизм в отдельном классе.Как я могу реализовать генератор кода Морзе?

Я уже пробовал так много разных методов, но все они, похоже, представляют какую-то проблему. Вещи, которые я пробовал до сих пор: создание таймера NS, используя вызовы метода задержки (performSelector: withObject: afterDelay).

Ниже приведен пример метода, который я использую для задержки, но проблема в том, что если пользователь вводит слово «aaaa», будет воспроизводиться только первый «a», потому что весь цикл будет завершен до Последовательность морзе даже выполняется. Было бы более идеальным, если бы цикл мог дождаться завершения замыкания, прежде чем продолжить.

В любом случае, это так, что я думал, что он должен быть реализован, но он, похоже, не работает, поэтому, возможно, есть лучший способ реализовать генератор кода Морзе или я просто пропустил шаг, поэтому, если кто-нибудь может, пожалуйста, помогите мне разобраться в этом, я бы очень признателен.

- (NSString *)convertTextToMorse:(NSString *)phrase { 

    for (int i = 0; i < [phrase length]; i++) { 

     unichar ch; 
     ch = [phrase characterAtIndex:i]; 
     NSLog(@"Processing charachter %c",ch); 

     //Dot = 100ms 
     //Dash = 300ms 
     //Pause = 200ms 

     switch (ch) { 
      case 'a': 
       //Morse "a" 
       [self playDotSound]; 
       [self performSelector:@selector(playDashSound) withObject:nil afterDelay:0.2]; 
       break; 
      case 'b': 
       //Morse "b" 
       break; 
      default: 
       break; 
     } 
    } 

    return phrase; 

} 

ответ

3

Другим вариантом может быть, чтобы запустить всю вещь на отдельном потоке:

- (NSString *) convertTextToMorse:(NSString *)phrase { 
    [self performSelectorInBackground:@selector(morseInternal:) withObject:phrase]; 
    return phrase; 
} 

- (NSString *) morseInternal:(NSString *)phrase { 
    NSAutoreleasePool *pool = [NSAutoreleasePool new]; 
    for (int i = 0; i < [phrase length]; i++) { 
     if (stopMorse) { 
      break; 
     } 
     unichar ch = [phrase characterAtIndex:i]; 
     NSLog(@"Processing charachter %c",ch); 
     switch (ch) { 
      case 'a': 
       [self playDotSound]; 
       [self pause]; 
       [self playDashSound]; 
      break; 
      case 'b': 
       //Morse "b" 
       break; 
      default: 
       break; 
     } 
    } 
    [pool release]; 
} 

- (void) pause { 
    [NSThread sleepForTimeInterval:0.2]; 
} 

Примечание я добавил stopMorse логическую переменную экземпляра, можно установить в истину, если вы хотите, чтобы остановить Морзе генерацию кода в середина строки.

+0

WOW !!!! Все, что я могу сказать, это то, что ты мой герой. Он отлично работает, спасибо большое – cgossain

+0

Если ответ работает на вас, нажмите галочку –

0

Как вы выясните, какие звуки играют, добавьте их в массив. Проиграйте массив и сохраните свою позицию в массиве по мере продвижения. Если вы застряли в синтаксическом разборе, остановитесь и продолжайте движение туда, где вы остановились.

В качестве альтернативы, выяснить, сколько времени занимает каждая буква, и использовать переменную для задержки воспроизведения.

0

NSTimers и задержки запуска цикла создают очень плохой код Морзе и ухудшаются при более высоком WPM. Лучше создать механизм синтеза звука DSP, достаточно хороший для миллисекундных точных барабанных петель (возможно, для использования RemoteIO Audio Unit), и использовать это для смешивания временных звуковых сигналов вместо перкуссионных образцов инструмента.