Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:3
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:7
Форум » starterkit.ru » Embedded Linux
Проблемы с приемом звукового потока
olber
Добавлено 12.06.2012 23:34
0
Сообщение: 1
olber
0

Пункты: 580
Регистрация: 06.04.2012
Добрый день

У меня плата SK-AT91SAM9260
Взял пример dev/dsp
Код

#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/soundcard.h>

#define LENGTH 3 /* how many seconds of speech to store */
#define RATE 8000 /* the sampling rate */
#define SIZE 8 /* sample size: 8 or 16 bits */
#define CHANNELS 1 /* 1 = mono 2 = stereo */

/* this buffer holds the digitized audio */
unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];

int main()
{
int fd; /* sound device file descriptor */
int arg; /* argument for ioctl calls */
int status; /* return status of system calls */

/* open sound device */
fd = open("/dev/dsp", O_RDWR);
if (fd < 0) {
perror("open of /dev/dsp failed");
exit(1);
}

/* set sampling parameters */
arg = SIZE; /* sample size */
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_BITS ioctl failed");
if (arg != SIZE)
perror("unable to set sample size");

arg = CHANNELS; /* mono or stereo */
status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
if (arg != CHANNELS)
perror("unable to set number of channels");

arg = RATE; /* sampling rate */
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_WRITE ioctl failed");

while (1) { /* loop until Control-C */
printf("Say something:\n");
status = read(fd, buf, sizeof(buf)); /* record some sound */
if (status != sizeof(buf))
perror("read wrong number of bytes");
printf("You said:\n");
status = write(fd, buf, sizeof(buf)); /* play it back */
if (status != sizeof(buf))
perror("wrote wrong number of bytes");
/* wait for playback to complete before recording again */
status = ioctl(fd, SOUND_PCM_SYNC, 0);
if (status == -1)
perror("SOUND_PCM_SYNC ioctl failed");
}
}


Проигрывание звука нормальное (проверял), а вот с чтением звука возникли трудности, наблюдаются случайные трески.
При попытке включить стерео режим трески были слышны поочередно: то в правом, то в левом ухе.
Где может быть ощибка?
Спасибо.


Плюс всегда слышен легкий шум (но это уже наверно не программная часть)
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 13.06.2012 00:21 Редактировалось 13.06.2012 00:26 Сообщение: 2
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
Щелчки могут быть из-за настройки plla - чтобы она лучше подходила для аудиокодека (делилась нацело на разные степени двойки) я подстраивал ее раньше в bootstrap. Проверьте еще утилитами alsa - aplay/arecord.

PS поищите по форуму через гоогле - помоему были но очень давно похожие темы, я у себя посмотрю - осталось ли чего с тех времен.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 13.06.2012 00:53 Сообщение: 3
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
PS поищите по форуму через гоогле - помоему были но очень давно похожие темы, я у себя посмотрю - осталось ли чего с тех времен.

не оно? тыц

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
olber
Добавлено 17.06.2012 21:57 Сообщение: 4
olber
0

Пункты: 580
Регистрация: 06.04.2012
Неправильно сформулировал - звукового потока вообще не слышно, есть только трески.
По ссылке походил вешь полезная, спасибо.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 17.06.2012 22:36 Сообщение: 5
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Неправильно сформулировал - звукового потока вообще не слышно, есть только трески.

неотчетливо прозвучала задача.. проигрывает, не проигрывает..
все, что пока понял, что посредством некоего семпла софта вы пытаетесь что-то проиграть, да?
что за звуковой формат использован?
если мп3, то оно и не должно просто так играть..
если WAV, то компрессированный/кодированный или еще как?
если сгенерить обычный некомпрессированный WAV, то его можно попробовать озвучить вот так:
Код
cat my-cool.wav > /dev/dsp

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
olber
Добавлено 28.07.2012 14:04 Сообщение: 6
olber
0

Пункты: 580
Регистрация: 06.04.2012
Добрый день
Извиняюсь за долгое молчание
Софт должен был делать следующее
читает 3 секунды из dev/dsp в буфер, а затем этот же буфер отправляет на проигрывание
И так по циклу
На выходе трески, хотя непосредственно проигрывание звука я проверял.
Обновил pll и прочее - буду проверять дальше.
Так же проверю вариант с файлом(см выше)

Дополнительный вопрос работает ли драйвер звука в дуплексе? На старом форму была тема Как проверить работу микрофона
Кто нибудь в курсе - решена ли задача сейчас?
Спуститься к концу Подняться к началу
Персональная информация
olber
Добавлено 30.07.2012 09:12 Сообщение: 7
olber
0

Пункты: 580
Регистрация: 06.04.2012
попробовал проиграть заранее известный файл
cat my-cool.wav > /dev/dsp
файл 48кHz 16 бит, mono (пробовал и stereo)
услышал скрежет
при этом если настраиваю сам:
Код

* open sound device */
fd = open("/dev/dsp", O_RDWR);
if (fd < 0) {
perror("open of /dev/dsp failed");
exit(1);
}

/* set sampling parameters */
arg = SIZE; /* sample size */
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_BITS ioctl failed");
if (arg != SIZE)
perror("unable to set sample size");

arg = CHANNELS; /* mono or stereo */
status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
if (arg != CHANNELS)
perror("unable to set number of channels");

arg = RATE; /* sampling rate */
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_WRITE ioctl failed");


есть, щелчки неизвестного происхождения но все "поет".
непонимаю
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux