Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как преобразовать short[10] в char[10]? 
:(
    Опции темы
586
Дата 10.12.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(Proger10 @  10.12.2009,  16:50 Найти цитируемый пост)
Мне нужно записывать 16 битный звук, а не 8-битный... 

для чего тогда это:
Цитата(Proger10 @  9.12.2009,  22:22 Найти цитируемый пост)
    for( i = 0; i < numSamples; i++ ) {
        myWav->myData[ i ] = ( ( char )( ( recordedSamples[ i ] ) >> 8 ) );
    }

PM   Вверх
Proger10
Дата 10.12.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



дык и ">> 16" не помогает.. smile Или там по-другому конвертить надо?
PM MAIL   Вверх
586
Дата 10.12.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Тогда данные преобразровывать не надо.
Вместо
Цитата
for( i = 0; i < numSamples; i++ ) {
        myWav->myData[ i ] = ( ( char )( ( recordedSamples[ i ] ) >> 8 ) );
    }

напиши
Код
memcpy(myWav->myData, recordedSamples, numSamples);

PM   Вверх
Proger10
Дата 10.12.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



почему-то оно мне не даёт там использовать memcpy:
-------------
patest_read_record.cpp: In function ‘int main(int, char**)’:
patest_read_record.cpp:475: ошибка: нет декларации ‘memcpy’ в этой области видимости
-------------

но почему? stdio.h подключён...

Добавлено через 2 минуты и 18 секунд
не ужели действительно прокатит.. честно говоря, не очень верится, покуда изначально я без преобразования ведь и делал...
PM MAIL   Вверх
586
Дата 10.12.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



попробуй #include <stdlib.h>
или #include <string.h>
или без использования memcpy:
Код
for( i = 0; i < numSamples; i++ ) {
        myWav->myData[ i ] = ((char*)recordedSamples)[i];
    }

PM   Вверх
Proger10
Дата 10.12.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



да.. это я уже пробовал. Шуршит и шипит такая запись.

Я вот не пойму... а точно ли звук 16битный?
Как думаете, может ли вот это:
Код

#define PA_SAMPLE_TYPE  paInt16
typedef short SAMPLE;
#define SAMPLE_SILENCE  (0)
#define PRINTF_S_FORMAT "%d"

как либо указывать на то, что звук 16битный, а не восьми?
PM MAIL   Вверх
586
Дата 10.12.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(Proger10 @  10.12.2009,  17:47 Найти цитируемый пост)
да.. это я уже пробовал. Шуршит и шипит такая запись.

Странно это - если до этого она быстро играла, а теперь шуршит.
А если так:
Код
for( i = 0; i < (numSamples/2); i++ ) {
        ((short*)myWav->myData)[i] = ((recordedSamples[i] & 0xFF00) >> 8) | ((recordedSamples[i] & 0x00FF) << 8);
    }

PM   Вверх
Proger10
Дата 10.12.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



С ">> 8" она ускорялась, а без этого - шипит smile

С указанным выше - вылетает вообще:
Код

*** glibc detected *** ./patest_read_record: free(): invalid next size (normal): 0x00000000016abbb0 ***           
======= Backtrace: =========                                                                                      
/lib/libc.so.6[0x7f4de69d26c8]                                                                                    
/lib/libc.so.6(cfree+0x76)[0x7f4de69d41d6]     

компайлер GCC.

Добавлено через 52 секунды
А если вот так:
Код

((char*)myWav->myData)[i] = ((recordedSamples[i] & 0xFF00) >> 8) | ((recordedSamples[i] & 0x00FF) << 8);

то ещё раз в 6 быстрее smile

Добавлено через 2 минуты и 11 секунд
...но чисто и без шипения  smile 
PM MAIL   Вверх
Proger10
Дата 10.12.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



В общем-то забил я на это и заюзал либу LibSndFile:
Код

    const char* outfilename = "out/foo.wav";

    SndfileHandle outfile( outfilename, SFM_WRITE, SF_FORMAT_WAV | SF_FORMAT_PCM_16, 1, 11025 );
    if ( not outfile ) return -1;

    outfile.write( &recordedSamples[0], numSamples );

жаль, что ещё одну либо за собой таскать прийдётся. Ну да фиг с ней.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.